You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Mladen Turk <mt...@apache.org> on 2007/05/10 19:55:03 UTC

Making apr_pools 'standalone'

Hi,

The current pool logic always assure the
pool will be destroyed when it's parent is destroyed
(up to the global_pool singleton), and that's great, but ...

That presumption makes APR behaving badly in
threaded environment applications with its own memory
management because each time the apr_pool is created
there is mutex lock.

I have a simple patch, and I would like the opinion from
someone that knows that area better then me.

How the patch works.

A typical scenario in 'known' memory management model is
as follows

1. pool = apr_pool_create
2. do something
3. apr_pool_destroy(pool)

This can be even extended by using allocator

1. allocator = apr_allocator_create
2. pool = apr_pool_create_ex(allocator)
3. apr_allocator_owner set(allocator, pool)
4. do something
5. apr_pool_destroy(pool)

Now, the later works fine, but it still inserts
the created pool in the parent/global pool chain
and that causes mutex lock/unlock in steps 2 and 5
with unnecessary linked list insert/remove.

With the patch the second scenario can be extended

1. allocator = apr_allocator_create
2. apr_allocator_owner_set(allocator, NULL)
3. pool = apr_pool_create_ex(allocator)
4. apr_allocator_owner set(allocator, pool)
5. do something
6. apr_pool_destroy(pool)

And the resulting pool will be standalone, and there
will be no mutex lock/unlock.

Of course there is potential memory leak in that case,
but like said the original presumption is that APR like that
is used in environments where there is already a known
memory manager, like Java etc...

The patch itself to my knowledge doesn't break
any existing implementation, and is backward compatible
because the APR versions that do not contain a patch
will simply put the new pool in the parents pool chain
and on explicit pool destroy remove it.
Of course it is backportable because it doesn't
introduce neither a new parameters nor new functions.

However it always set the global_pool as an allocator
owner, but the proper usage is to use the
apr_allocator_owner_set anyhow.

Sorry, for the long email, but I tried to be as concise
as I could :)

Comments?