Andi Gutmans wrote: > I just checked and it seems like Apache APR memory pools use mutex > locking. > It'd be better to use functions like the Win32 ones which don't use > mutex locking (as we made sure that only one thread allocates from its > pool). This could be achieved by compiling apr_pools.c without > APR_HAS_THREADS but I bet the default Apache 2 build has this enabled. > Any ideas? > Andi
It's not as bad as it looks. :-) The APR pools do locking only in a few situations: * Creating a new pool * Creating a subpool of a pool * Destroying a pool * Adding space to an existing pool, if it's used up its initial 8KB allocation So the simplest case, the lifetime of a pool looks like: - create the pool, requiring a lock/unlock - do hundreds of allocations from the pool, none of which require locking - destroy the pool at the end of the request, requiring one lock/unlock for the entire thing In general, that model works well: over the lifetime of a pool that handles O(n) allocation operations, we only have to do O(1) lock/unlock operations. But there's an additional optimization that's possible: Sander Striker added support for thread-specific allocators a while back. The per-request pools in most of the Apache 2.0 MPMs take advantage of this. Each pool has an "apr_allocator" object that supplies it with raw memory blocks. These allocators can be designated as either thread-private or shared across threads. And a thread-private allocator gets to skip the mutex operations. If you want to try the APR pools, the easiest approach might be to either use the request_rec->pool directly or create a sub-pool from it. --Brian -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php