blob: a6050d926878607876f71a658ab7e49271c40d35 [file] [log] [blame]
APACHE PORTABLE RUNTIME (APR) LIBRARY STATUS: -*-text-*-
Last modified at [$Date$]
Releases:
Standalone
1.0.0 rc2 : tagged June 30th 2004 (APR_1_0_RC2)
1.0.0 rc1 : tagged June 18th 2004 (APR_1_0_RC1)
0.9.3 : tagged March 30, 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
RELEASE 1.0.1 SHOWSTOPPERS:
CURRENT VOTES:
CURRENT test/testall -v EXCEPTIONS:
Please add any platform anomilies to the following exception list.
* various tests fail on Unix in VPATH builds.
* '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.
* BUG: Win32 fails test in File Info: test_stat_eq_finfo
apr_stat and apr_getfileinfo differ in protection ... wrowe
guesses that we are checking the handle objects' permissions
rather than the filesystem objects' permissions.
* Win32 Not Implemented tests
Pipes: set_timeout/read_write; can't timeout blocking pipes
Socket Creation: tcp6_socket and udp6_socket (at least by default)
Socket Options: corkable: TCP isn't corkable
Users: username: Groups from apr_uid_get not implemented
RELEASE NON-SHOWSTOPPERS BUT WOULD BE REAL NICE TO WRAP THESE UP:
* Someone needs to port testucs to Unix. Right now it only works
on Windows.
* 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: Will Rowe was working on this.
* 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
Win32: apr_thread_cond_timedwait(), apr_proc_mutex_*()
(Is proc_mutex unnecessary on Win32?)
* 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.
* 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
* Win32 apr_proc_create fails to create 16 bit apps detached
(a win32 bug.) The question - test in advance (slow) or
recover gracefully from failure and try again? Only the test
method will work on Win9x, since it will appear to work, only
to encounter mangled pipes. Win2K (NT?) simply fails.
* 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?
Status: Greg +1 (volunteers)
* configure.in does post-processing on the AC_OUTPUT files (for
VPATH support). This means that config.status doesn't do the
right thing when you re-run it. We ought to revamp the makefiles
to do the right AC_SUBST stuff rather than depend upon rewriting.
Sascha: As the rewriter is a crude hack, I would not worry too
much about it. It is designed to go away once we have
a proper build system in place.
One of the perceived deficiencies of automake is that it
uses AC_SUBST too often, thereby slowing down the task of
generating Makefiles significantly, because it applies
dozens of substitutions to each Makefile. And why? Make's
built-in macro processing is much more powerful, and
combined with the include facility, generating Makefiles
becomes simpler and faster.
Justin says: "I think this got fixed with Roy's build changes."
* 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.
* 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.
* 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.
* Generate a good bug report to send to the FreeBSD hackers that details
the problems we have seen with threads and system calls (specifically
sendfile data is corrupted). From our analysis so far, we don't think
that this is an APR issue, but rather a FreeBSD kernel issue. Our
current solution is to just disable threads across the board on
FreeBSD.
MsgID: <20010828091959.D17570@ebuilt.com>
Status: Fixed in -CURRENT. MFC in about a week. Continuing
testing with threads on FreeBSD.
FreeBSD PR kern/32684:
http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/32684
* 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, and Win32.
* 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>
Documentation that needs writing:
* API documentation
Ian Says: APR Stuff in now in Doxygen format, which is the first step.
David says: are we planning on doing any more? I'm tempted to remove this
item.
* apr-site needs to be revamped with Anakia/XHTML.
* Identify and implement those protection bits that have general
usefulness, perhaps hidden, generic read-only [immutable],
effective current user permissions, etc.
* Maybe make the following functions return void instead of
apr_status_t, as they cannot ever error:
apr_md5_init()
apr_md5_update()
apr_md5_final()
apr_md5_encode()
apr_md5() /* plus make the obvious code tweak in this one */
(Volunteer: Karl Fogel <kfogel@collab.net>.)
However, don't do this until after apr and apr-util offer
library version numbers, and httpd uses those numbers to
indicate which version it needs. Until the libraries are
versioned, this api change is [somewhat] painful for httpd.
Status: Still in discussion, current leanings appear to be
Bill Stoddard -0.5 (?)
Sander Striker +1
Greg Stein +1
Karl Fogel +1
david: This was rejected for 1.0 following Ben L's comment that
should we ever start using any other form of md5 (e.g.
openssl) then errors would become a distinct possibility.
Stuff for post 1.0:
* 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]>
This was listed as a showstopper for 1.0, but while the 2 patches above
exist neither was able to garner enough votes to be included in 1.0.
Will Rowe commented that a combination of the 2 would probably be the right
approach, a view that seems to have a lot of merit. Hopefully we can solve
this post 1.0. There were also enough people who felt that it wasn't a
real showstopper for it to be bumped.
* Must namespace protect all include/apr_foo.h headers. Jon Travis
has especially observed these including apr within Apache-1.3.
Message-ID: <20020128100116.A4288@covalent.net>
Deprecating the symbols in 0.9, eliminating them with 1.0.
(Those problems have been fixed, but it is a good example of
what to look for.)
Some headers with issues:
apr.hnw (READDIR_IS_THREAD_SAFE, ENUM_BITFIELD,
_POSIX_THREAD_SAFE_FUNCTIONS (?))
* 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.