summaryrefslogtreecommitdiff
path: root/STATUS
blob: 2ed90adcbbd2c27fa655e48a1424106096b08224 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
APACHE PORTABLE RUNTIME (APR) LIBRARY STATUS:        -*- coding: utf-8 -*-
Last modified at [$Date$]

The current version of this file can be found at:

  * http://svn.apache.org/repos/asf/apr/apr/trunk/STATUS


NOTICE:

Effective with version 2.0 , apr-util ceases to exist.  For reference,
the final standalone apr-util can be found in subversion at:

  * http://svn.apache.org/repos/asf/apr/apr-util/branches -r784519


Patches considered for backport are noted in their branches' STATUS:

  * http://svn.apache.org/repos/asf/apr/apr/branches/0.9.x/STATUS
  * http://svn.apache.org/repos/asf/apr/apr/branches/1.3.x/STATUS
  * http://svn.apache.org/repos/asf/apr/apr/branches/1.4.x/STATUS
  * http://svn.apache.org/repos/asf/apr/apr/branches/1.5.x/STATUS
  * http://svn.apache.org/repos/asf/apr/apr-util/branches/0.9.x/STATUS
  * http://svn.apache.org/repos/asf/apr/apr-util/branches/1.3.x/STATUS
  * http://svn.apache.org/repos/asf/apr/apr-util/branches/1.4.x/STATUS
  * http://svn.apache.org/repos/asf/apr/apr-util/branches/1.5.x/STATUS

Releases:
    2.0.0     : in development on trunk/
    1.7.0     : in development on branches/1.7.x
    1.6.4     : in maintenance
    1.6.3     : released October 22, 2017
    1.6.2     : released June 14, 2017
    1.6.1     : not released
    1.6.0     : not released
    1.5.2     : released April 29, 2015
    1.5.1     : released April 20, 2014
    1.5.0     : released November 18, 2013
    1.4.8     : released June 21, 2013
    1.4.7     : not released
    1.4.6     : released Feb 14, 2012
    1.4.5     : released May 22, 2011
    1.4.4     : released May 9, 2011
    1.4.3     : not released
    1.4.2     : released April 3, 2010
    1.4.1     : not released
    1.4.0     : not released
    1.3.9     : released September 23, 2009
    1.3.8     : released August 6, 2009
    1.3.7     : released July 23, 2009
    1.3.6     : released July 4, 2009
    1.3.5     : released June 5, 2009
    1.3.4     : not released
    1.3.3     : released August 14, 2008
    1.3.2     : released June 23, 2008
    1.3.1     : not released
    1.3.0     : released June 3, 2008
    1.2.12    : released November 25, 2007
    1.2.11    : released September 6, 2007
    1.2.10    : not released
    1.2.9     : released June 7, 2007
    1.2.8     : released December 4, 2006
    1.2.7     : released April 14, 2006
    1.2.6     : released March 25, 2006
    1.2.5     : not released
    1.2.4     : not released
    1.2.3     : not released
    1.2.2     : released October 11, 2005
    1.2.1     : released August 18, 2005
    1.2.0     : not released
    1.1.2     : no such version
    1.1.1     : released March 17, 2005
    1.1.0     : released January 25, 2005
    1.0.1     : released November 19, 2004
    1.0.0     : released September 1, 2004
    0.9.18    : in maintenance
    0.9.17    : released November 25, 2007
    0.9.16    : released September 6, 2007
    0.9.15    : not released
    0.9.14    : released June 7, 2007
    0.9.13    : released December 4, 2006
    0.9.12    : released April 13, 2006
    0.9.11    : released March 30, 2006
    0.9.10    : tagged March 22, 2006, not released
    0.9.9     : tagged January 30, 2006, not released
    0.9.8     : tagged January 27, 2006, not released
    0.9.7     : released October 11, 2005
    0.9.6     : released February 4, 2005
    0.9.5     : released November 19, 2004
    0.9.4     : released September 25, 2003
    0.9.3     : released April 3, 2003
    0.9.2     : released March 22, 2003
    0.9.1     : released September 11, 2002
    0.9.0     : released August 28, 2002

Bundled with httpd:
    2.0a9     : released December 12, 2000
    2.0a8     : released November 20, 2000
    2.0a7     : released October 8, 2000
    2.0a6     : released August 18, 2000
    2.0a5     : released August 4, 2000
    2.0a4     : released June 7, 2000
    2.0a3     : released April 28, 2000
    2.0a2     : released March 31, 2000
    2.0a1     : released March 10, 2000

Contributors looking for a mission:

  * Just do an egrep on "TODO" or "XXX" in the source.

  * Review the bug database at: http://issues.apache.org/bugzilla/

  * Review the "PatchAvailable" bugs in the bug database:

    https://issues.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&product=APR&keywords=PatchAvailable

    After testing, you can append a comment saying "Reviewed and tested".

  * Open bugs in the bug database.


RELEASE SHOWSTOPPERS:

  * apr_file_rotating_* on most platforms

CURRENT VOTES:


CURRENT test/testall -v EXCEPTIONS:

    Please add any platform anomilies to the following exception list.

    * 'testipsub' will tickle an Solaris 8 getaddrinfo() IPv6 bug,
      causing the test to hang.  Configure with --disable-ipv6 if
      using an unpatched Solaris 8 installation.

    * The 'testdso' tests will not work if configured with
      --disable-shared since the loadable modules cannot be built.

    * 'testdso' fails on older versions of OpenBSD due to dlsym(NULL,
      ...) segfaulting.

    * Win32 Not Implemented tests 
        poll: pollcb not implemented
        procmutex: lacks fork() support
        sock : Sync behavior causes us to skip one test
        sockets: tcp6_socket/udp6_socket skipped for no IPv6 adapter
        sockopt: TCP isn't corkable
        users: username: Groups from apr_uid_get not implemented

    * Win32 tests are known to fail when APR_HAVE_IPV6, but there is no
      ipv6 adapter is loaded (even loopback is sufficient).  There are
      obnoxious getaddrinfo() missing results from looking up a fixed
      IPv4-IPv6 mixed notation address, which reflect a Win32 bug.
        ipsub: One test fails for IPv6 with no IPv6 adapter configured
        sock : One test fails for IPv6 with no IPv6 adapter configured


ONGOING REMINDERS FOR STYLE/SUBSTANCE OF CONTRIBUTING TO APR:

    * Flush out the test suite and make sure it passes on all platforms.
      We currently have about 450 functions in APR and 147 tests.  That
      means we have a large number of functions that we can't verify are
      actually portable.  This TODO includes finishing the migration to the
      unified test suite, and adding more tests to make the suite
      comprehensive.

    * Eliminate the TODO's and XXX's by using the doxygen @bug feature
      to allow us to better track the open issues, and provide historical
      bug lists that help porters understand what was wrong in the old
      versions of APR that they would be upgrading from.

    * Continue to review, deprecate and eliminate from 2.0 all namespace
      un-protected names throughout include/apr_foo.h headers.


RELEASE NON-SHOWSTOPPERS BUT WOULD BE REAL NICE TO WRAP THESE UP:

    * Implement TOS for linux and solaris and bsd network API's.
      The patches below implement only one of these API's, see the
      pointer to mod_ftp in this bugzilla incident for hints to offer
      all the necessary implementations, for starters.
        http://qaix.com/apache-http-server/569-729-patch-add-ip-tos-support-read.shtml
        https://issues.apache.org/bugzilla/show_bug.cgi?id=42848

    * Need a proper fragmentation control API for clearing apr_pool's,
      where the block alloc/clear/realloc sequence introduces more and
      more unusable spaces in the physical blocks.  APR must provide
      a mechanism to recognize such fragmented conditions, free the
      physical pages, and allocate a new single pool block.  See also
        http://svn.haxx.se/dev/archive-2008-10/0070.shtml

    * Implement apr_pool_realloc for consumers such as apr_vformatter,
      where the possibility to extend an allocation exists.  Given that
      an apr function does this, external consumers should be allowed to.

    * Need some architecture/OS specific versions of the atomic operations.
	progress: generic, solaris Sparc, FreeBSD5, linux, and OS/390 done
	need: AIX, AS400, HPUX

    * The new lock API is a full replacement for the old API, but is
      not yet complete on all platforms. Components that are incomplete
      or missing include:
      Netware: apr_proc_mutex_*() (Is proc_mutex unnecessary on Netware?)
		* proc_mutex is not necessary on NetWare since the OS does
		  not support processes.  The proc_mutex APIs actually
		  redirect to the thread_mutex APIs. (bnicholes)
      OS/2: apr_thread_cond_*(), apr_proc_mutex_*()

      Less critical components that we may wish to add at some point:
      Beos: apr_thread_rwlock_try*lock()
            apr_proc_mutex_trylock()
      Unix: apr_thread_rwlock_*() for platforms w/o rwlocks in pthread

    * Need to contemplate apr_strftime... platforms vary.  OtherBill
      suggested this solution (but has no time to implement):
        Document our list of 'supported' escapes.
        Run some autoconf/m4 magic against the complete list we support.
        Move the strftime re-implementation from time/win32 to time/unix.
        Add some APR_HAVE_STRFTIME magic to use the system fn, or fail
        over to time/unix/strftime.c.
        Message-ID: <025e01c1a891$bf41f660$94c0b0d0@v505>

    * Using reentrant libraries with non-threaded APR
        - Anecdotal evidence exists that suggests it is bad to
          mix reentrant and non-reentrant libraries and therefore
          we should always use the reentrant versions.
        - Unfortunately, on some platforms (AIX 4.2.1) defining
          the reentrant flag (-D_THREAD_SAFE) causes builds to fail,
          and so one would expect --disable-threads to fix this.
          Although this has been fixed for that particular version
          of AIX, it may be useful to only enable the reentrant
          versions when threads are enabled.
        How will we deal with this issue once APR becomes a standalone
        library? It is perfectly legitimate to have apps needing
        both versions (threaded/reentrant and non-threaded/non-reentrant)
        on the same machine.
        Wrowe chuckles, uhm, it already is.  And seems most have shifted
        to shipping threaded builds, of at least apr itself.

    * Pools debugging
        - Find a way to do check if a pool is used in multiple
          threads, while the creation flags say it isn't.  IOW,
          when the pool was created with APR_POOL_FNEWALLOCATOR,
          but without APR_POOL_FLOCK.
          Currently, no matter what the creation flags say, we always
          create a lock.  Without it integrity_check() and
          apr_pool_num_bytes() blow up (because they traverse pools
          child lists that possibly belong to another thread, in
          combination with the pool having no lock).  However,
          this might actually hide problems like creating a child pool
          of a pool belonging to another thread.
          Maybe a debug function apr_pool_set_owner(apr_thread_t *) in
          combination with extra checks in integrity_check() will point
          out these problems.  apr_pool_set_owner() would need to be called
          everytime the owner(the thread the pool is being used in) of
          the pool changes.

        - Implement apr_pool_join and apr_pool_lock.  Those functions
          are noops at the moment.

        - Add stats to the pools code.  We already have basic stats
          in debug mode.  Stats that tell us about wasted memory
          in the production code require more thought.
            Status: Sander Striker is looking into this (low priority)

        David says this is a 1.1 issue.

    * Get OTHER_CHILD support into Win32
        Status: Bill S. is looking into this

    * SysV semaphore support isn't usable by Apache when started as
      root because we don't have a way to allow the semaphore to be
      used by the configured User and Group.  Current work-around:
      change the initial permissions to 0666.  Needed code:  See
      1.3's http_main.c, SysV sem flavor of accept_mutex_init().
      Status: Jim will look into this
      Update: Apache deals with this itself, though it might be nice
              if APR could do something.

    * Build scripts do not recognise AIX 4.2.1 pthreads
      Justin says: "Is this still true?"

    * FirstBill says we need a new procattr, APR_CREATE_SUSPENDED (or
      something similar) to direct ap_create_process to create the
      process suspended. We also need a call to wake up the suspended 
      process.  This may not be able to be implemented everywhere though.
        Status: OtherBill asks, why?  What is the benefit, how is it
        portably implemented?  Unless this creates some tangible that
        mirrors another platform, then I'm -1.

    * Replace tables with a proper opaque ADT that has pluggable
      implementations (including something like the existing data type,
      plus hash tables for speed, with options for more later).
	Status: fanf is working on this.

    * add a version number to apr_initialize() as an extra failsafe against
      (APR) library version skew.
      MsgID: <Pine.LNX.4.10.10005231712380.31927-100000@nebula.lyra.org>
      Status: Greg -1, Jeff +1, Ryan +1, Tony -0(?), david +1

    * add apr_crypt() and APR_HAS_CRYPT for apps to determine whether the
      crypt() function is available, and a way to call it (whether it is
      located in libc, libcrypt, or libufc)
      Justin says: Should apr_crypt() be in apr-util?
      Wrowe answers: of course!  It's called openssl DES_fcrypt ;-)

    * use os_(un)cork in network_io/unix/sendrecv.c for FreeBSD's
      sendfile implementation.

      david: The socket options stuff is now in and using it should
             reduce the number of syscalls that are required for 
             os_cork and uncork, so the code should be reviewed to
             make use of the new calls.  If no-one beats me to it I'll
             get around to it soonish...

    * toss the per-Makefile setup of INCLUDES; shift to rules.mk.in
        rbb: This is a bad thing IMHO.  If we do this, then we
             can't use these makefiles for anything else.  For example,
             apr-util

    * add the rest of the pool accessor declare/impl macros.
      Justin says: Both thread and file have the accessors now.  Any others?
      Status: Greg volunteers

    * I think apr_open_stderr() and friends *should* dup() the
      descriptor.  That would allow the new/returned file to be closed
      (via pool cleanup or manually) without accidentally closing
      stderr/out.
      wrowe: votes -1, reasons directly manipulate this through APR

    * need to export (in code, not just build scripts) the shared
      library extension (e.g. ".so") for the platform. clients need to
      use this to construct filenames to pass to apr_dso_load()
      -- note on Win32 we distinguish 'apache module' names from other 
         'loadable module' names, so be careful with Apache's directive.
         AIX, HPUX may use similar (.so for a 'module's name while the
         defaults .a or .sl are used for libs.)

    * Possible gmtime_r replacement in explode_time
      On Solaris (and possibly others), the gmtime_r libc function obtains
      a mutex.  We have seen 21/25 threads being blocked in this mutex on 
      a threaded httpd MPM when requesting static pages.  It may be worth 
      it to hand optimize this since there is no real need for a mutex at 
      the system level (straight arithmetic from what I can tell).  If you 
      have access to the Solaris source code:
        osnet_volume/usr/src/lib/libc/port/gen/time_comm.c.

    * Add a way to query APR for what features it has at runtime (i.e. 
      threads).
      Justin says: I'm not completely sold on this, but it has been mentioned 
                   before and at least added to STATUS.

    * apr_xlate.h generates a bunch of compiler warnings.
      Jeff asks: which platform?
      Justin says: Solaris with Forte 6.1.

    * fcntl() oddness on Solaris.  Under high loads, fcntl() decides to
      return error code 46 (ENOLCK).

      httpd (prefork MPM) error log says (predictably):

      (46)No record locks available: couldn't grab the accept mutex
 
      All of the children report this and subsequently exits.  httpd is now 
      hosed.  AFAICT, this does not look to be an out-of-fds error.
 
      Solaris's man page says:
        ENOLCK
           The  cmd argument is F_SETLK, F_SETLK64, F_SETLKW,  or
           F_SETLKW64  and  satisfying the lock or unlock request
           would result in the number of locked  regions  in  the
           system exceeding a system-imposed limit.

      Justin says: What is this system-imposed limit and how do we change it?
                   This gives me more rationale for switching the default
                   interprocess lock mechanism to pthread (if available).

      Explanation (from Kristofer Spinka <kspinka@style.net>):
      ============
        The system imposed default limit of outstanding lock requests is
        512.
        You can verify this by, in a contemporary version of Solaris:

        # mdb -k
        > tune_t_flckrec/D
        tune_t_flckrec:
        tune_t_flckrec: 512

        This can be increased by adding the following to /etc/system:

        set tune_t_flckrec=1024

        and rebooting.

        Of course "1024" can be any reasonable limit, although we do not know
        what "reasonable" should be, so be conservative, only increase this as
        necessary.

    * There are some optimizations that can be done to the new
      apr_proc_*() functions (on UNIX). One that may reduce pointer
      indirection would be to make the apr_proc_mutex_unix_lock_methods_t
      first-class members of the apr_proc_mutex_t structure.

    * Condition variables are tricky enough to use, and even trickier
      to implement properly. We could really use a better test case
      for those subtle quirks that sometimes creep into CV implementations.

    * Once we are fully satisfied with the new lock API, we can
      begin to migrate the old API to be implemented on top of the
      new one, or just decide to get rid of it altogether.
      
    * FreeBSD returns 45 (EOPNOTSUPP) when the lockfile is on a NFS
      partition when you call fcntl(F_SETLKW).  It may be good if we 
      can somehow detect this and error out when creating the lock
      rather than waiting for the error to occur when acquiring lock.

    * Fix autoconf tests for strerror_r on BeOS and remove the hack in
      misc/unix/errorcodes.c to get error reporting working.  Committed as
      the solution is elusive at present.

    * implement APR_PROGRAM_ENV and APR_PROGRAM_PATH on BeOS, OS/2, Netware

    * stat() on a few platforms (notably Solaris and AIX) succeeds for
      a non-directory even if a trailing '/' was specified in the
      name.  APR should perhaps simulate the normal -1/ENOTDIR
      behavior in APR routines which retrieve information about the
      file.  Note: Win2K fails GetFileAttributesEx in this scenario.
      See OtherBill's comments in this message to dev@httpd.apache.org:
      Message-Id: <5.1.0.14.2.20020315080852.00bce168@localhost>

    * Identify and implement those protection bits that have general 
        usefulness, perhaps hidden, generic read-only [immutable],
        effective current user permissions, etc.

    * dso getsym implementation are becoming very strict about returning
      a fn pointer v.s. a data pointer, this should be split in apr_dso.

Interface Changes Postponed for APR 2.0:

    * apr_proc_other_child_register()'s write_fd argument should be removed
      or made used.  The comment in the API previously said:

         write_fd duplicates the proc->out stream, it's really
         redundant and should be replaced in the APR 1.0 API with a
         bitflag of which proc->in/out/err handles should be health
         checked.  no platform currently tests the pipes health.

    * apr_atomic_casptr() has the volatile qualifier in the wrong
      place: should take "pointer to volatile pointer to void", not
      "pointer to pointer to volatile void".

    * apr_socket_sendfile(): the offset parameter should not be
      pass-by-reference, or it should be updated to do something
      useful.

    * apr_password_get(): the bufsize parameter should not be
      pass-by-reference.

    * apr_allocator.h: apr_memnode_t's use of uint32_t's doesn't match
      well with allocation sizes being apr_size_t, possibly this can
      be improved by using apr_size_t throughout.

    * apr_hash_count() should take a const apr_hash_t * argument.

    * apr_ino_t should be an ino64_t in LFS builds.

    * possible type renames:

        apr_file_info_t                  from apr_finfo_t 
        apr_file_attrs_t                 from apr_fileattrs_t
        apr_file_seek_where_t            from apr_seek_where_t
        apr_lock_mech_e                  from apr_lockmech_e
        apr_time_interval_t              from apr_interval_time_t
        apr_time_interval_short_t        from apr_short_interval_time_t

    * wrowe writes:
      Looking at bug 32520, it occurs to me that exploding times using the
      apr_time_exp_* functions; it would make more sense to split ->tm_usec into

        ->tm_msec thousandths (milleseconds)
        ->tm_usec millionths  (microseconds)

      for most display purposes.  It's trivial to roll them together with the
      format string %03d%03d if that's what's desired, or display simply
      %02d.%03d if millisecond resolution is desired.  It would also shrink
      the fields to int's so unpacking would be slightly slower, using them
      would be slightly faster, for what's likely to be little impact on
      performance.

    * The other-child API doesn't allow the apr_exit_why_e to be passed to the
      application's maintenance function.  The expected usage is that the
      application calls apr_proc_wait[_all_procs]() and is given back
      apr_exit_why_e and exit_code_or_signal_num, thus losing the original
      (on Unix, at least) representation which held both pieces of information
      in an int.  Both pieces of data should be available to the maintenance 
      function so that it has the opportunity to take different actions.  An
      example would be to issue messages about probable misconfiguration when
      receiving a certain exit code and trying to restart otherwise.  Thus, 
      apr_proc_other_child_alert() should take an additional apr_exit_why_e 
      parameter, as should the application-provided maintenance function.  The 
      exit-why value would be ignored in the same circumstances as the existing 
      status parameter: reason != APR_OC_REASON_DEATH.

    * apr_file_gets() should take an apr_size_t size parameter?

    * apr_table_vdo should not continue iterating through the keys
      list once the callback function returns non-zero; see JCW's
      comment in apr_tables.c.

    * The library SONAME should vary for the different library ABIs - 
      i.e. LFS support, IPv6 support or not.

    * remove APR_POLL_LASTDESC from apr_datatype_e.

    * Almost every API in APR depends on pools, but pool semantics
      aren't a good match for a lot of applications.  We need to find
      a way to support alternate allocators polymorphically without
      a significant performance penalty.

    * apr_global_mutex_child_init and apr_proc_mutex_child_init aren't
      portable.  There are a variety of problems with the locking API when it
      is used with apr_create_proc instead of apr_fork.  First, _child_init
      doesn't take a lockmech_e parameter so it causes a segfault after the
      apr_proc_create, because the proc_mutex field hasn't been initialized.
      When the lockmech_e parameter is added, it _still_ doesn't work, because
      some lock mechanisms expect to inherit from the parent process.  For
      example, sys V semaphores don't have a file to open, so the child process
      can't reaquire the lock.

      jerenkrantz says: This is not a showstopper and I believe the above
      analysis is slightly confusing.  The real problem here is that
      apr_*_mutex_child_init assumes a shared memory space - that is, the
      children processes have access to the parent apr_*_mutex_t pointer.  The
      children just call child_init on the original, inherited apr_*_mutex_t.
      Unlike globalmutexchild in test, apr_*_mutex_create is *not* intended to
      be called from the child and subsequently call child_init.  Instead,
      apr_create_proc is intended to exec separate processes with disjoint
      memory addresses.  Currently, APR does not provide a cross-platform
      mechanism for joining an already existing lock.  A simple
      'apr_*_mutex_join' which is intended to be called from separate
      processes to an already-existing lock would solve this problem.
      child_init is not intended to be used this way.  Even with SysV
      semaphores, using IPC_PRIVATE should still work due to the parent-child
      relationship.  A strawman has been posted to dev@apr:
      Message-Id: <213031CF0406DE1AC426A411@[10.0.1.137]>

    * The return type of a thread function (void *) is inconsistent with
      the type used in apr_thread_exit()/apr_thread_join() (apr_status_t).
      The thread function's return type should be changed to apr_status_t
      so that a return from the thread main function has the same effect
      as apr_thread_exit().
      See Message-Id: <E16JjZA-0007hg-00@zakath.apana.org.au> for thread
      discussing this.
        +1: BrianH, Aaron, david, jerenkrantz
      Status: Deferred to 2.0.0 (API change)