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

Reply via email to