On Saturday, 17 March 2012 11:03:32 Torsten Förtsch wrote:
> Further, I'd like to implement tests for C<die $string> and 
> C<die $reference> in a pool cleanup

This is a request for comment. So please comment!

Should we really allow pool cleanups to throw exceptions?

Assuming I have a pool with 2 registered cleanups. One dies. Should the other 
be called if the first one dies?

If yes, what should the value of $@ be if the second one also dies? If the 
second one does not die should $@ be cleared?

After a bit odf thinking about it I tend to forbid pool cleanups (and 
PerlCleanupHandlers) to die. If they do we can:

1) completely ignore the exception

2) stringify it and write it to STDERR

3) gather it in a special hash, e.g. @APR::Pool::cleanup_exceptions

Anyway, the current code in trunk is wrong. No matter if we rethrow the 
exception as is or a stringified version of it, we must not leave 
mpxs_cleanup_run() via longjmp() due to the way apr_pool_destroy() is 
implemented:

APR_DECLARE(void) apr_pool_destroy(apr_pool_t *pool)
{
...
    /* Run cleanups */
    run_cleanups(&pool->cleanups);

...

    /* Remove the pool from the parents child list */
    if (pool->parent) {
...
        if ((*pool->ref = pool->sibling) != NULL)
            pool->sibling->ref = pool->ref;
...

At first, all cleanups are run. Only then the pool being destroyed is 
disconnected from it parent. So, if we leave one of the cleanups via non-local 
goto we get partly destroyed pool still connected to its parent. Now, when the 
parent is destroyed it will destroy the partly destroyed one again.

Torsten Förtsch

-- 
Need professional modperl support? Hire me! (http://foertsch.name)

Like fantasy? http://kabatinte.net


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@perl.apache.org
For additional commands, e-mail: dev-h...@perl.apache.org

Reply via email to