| 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. |
| |
| |