On Wed, 2009-06-10 at 11:34 +1000, Bojan Smojver wrote: > Or, maybe even this. Compiles and passes make check (surprisingly!).
Here is a go-crazy patch. Deals with LDAP, DBD, DBM and DSO init itself. -- Bojan
Index: ldap/apr_ldap_stub.c =================================================================== --- ldap/apr_ldap_stub.c (revision 783165) +++ ldap/apr_ldap_stub.c (working copy) @@ -23,6 +23,7 @@ #include "apr_errno.h" #include "apr_pools.h" #include "apr_strings.h" +#include "apr_atomic.h" #include "apu_version.h" #if APR_HAS_LDAP @@ -30,6 +31,7 @@ #if APU_DSO_BUILD static struct apr__ldap_dso_fntable *lfn = NULL; +static apr_uint32_t initialised = 0, in_init = 1; static apr_status_t load_ldap(apr_pool_t *pool) { @@ -37,11 +39,21 @@ apr_dso_handle_sym_t symbol; apr_status_t rv; + if (apr_atomic_inc32(&initialised)) { + apr_atomic_set32(&initialised, 1); /* prevent wrap-around */ + + while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */ + ; + + return APR_SUCCESS; + } + /* deprecate in 2.0 - permit implicit initialization */ apu_dso_init(pool); rv = apu_dso_mutex_lock(); if (rv) { + apr_atomic_dec32(&in_init); return rv; } @@ -56,6 +68,8 @@ } apu_dso_mutex_unlock(); + apr_atomic_dec32(&in_init); + return rv; } Index: dbd/apr_dbd.c =================================================================== --- dbd/apr_dbd.c (revision 783165) +++ dbd/apr_dbd.c (working copy) @@ -26,6 +26,7 @@ #include "apr_hash.h" #include "apr_thread_mutex.h" #include "apr_lib.h" +#include "apr_atomic.h" #include "apu_internal.h" #include "apr_dbd_internal.h" @@ -33,6 +34,7 @@ #include "apu_version.h" static apr_hash_t *drivers = NULL; +static apr_uint32_t initialised = 0, in_init = 1; #define CLEANUP_CAST (apr_status_t (*)(void*)) @@ -90,7 +92,12 @@ apr_status_t ret = APR_SUCCESS; apr_pool_t *parent; - if (drivers != NULL) { + if (apr_atomic_inc32(&initialised)) { + apr_atomic_set32(&initialised, 1); /* prevent wrap-around */ + + while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */ + ; + return APR_SUCCESS; } @@ -141,6 +148,8 @@ apr_pool_cleanup_register(pool, NULL, apr_dbd_term, apr_pool_cleanup_null); + apr_atomic_dec32(&in_init); + return ret; } Index: misc/apu_dso.c =================================================================== --- misc/apu_dso.c (revision 783165) +++ misc/apu_dso.c (working copy) @@ -27,6 +27,7 @@ #include "apr_hash.h" #include "apr_file_io.h" #include "apr_env.h" +#include "apr_atomic.h" #include "apu_internal.h" #include "apu_version.h" @@ -37,6 +38,7 @@ static apr_thread_mutex_t* mutex = NULL; #endif static apr_hash_t *dsos = NULL; +static apr_uint32_t initialised = 0, in_init = 1; #if APR_HAS_THREADS apr_status_t apu_dso_mutex_lock() @@ -76,7 +78,12 @@ apr_pool_t *global; apr_pool_t *parent; - if (dsos != NULL) { + if (apr_atomic_inc32(&initialised)) { + apr_atomic_set32(&initialised, 1); /* prevent wrap-around */ + + while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */ + ; + return APR_SUCCESS; } @@ -94,6 +101,8 @@ apr_pool_cleanup_register(global, NULL, apu_dso_term, apr_pool_cleanup_null); + apr_atomic_dec32(&in_init); + return ret; } Index: dbm/apr_dbm.c =================================================================== --- dbm/apr_dbm.c (revision 783165) +++ dbm/apr_dbm.c (working copy) @@ -24,6 +24,7 @@ #define APR_WANT_STRFUNC #include "apr_want.h" #include "apr_general.h" +#include "apr_atomic.h" #include "apu_config.h" #include "apu.h" @@ -59,6 +60,7 @@ #if APU_DSO_BUILD static apr_hash_t *drivers = NULL; +static apr_uint32_t initialised = 0, in_init = 1; static apr_status_t dbm_term(void *ptr) { @@ -117,8 +119,13 @@ } else usertype = 1; - if (!drivers) - { + if (apr_atomic_inc32(&initialised)) { + apr_atomic_set32(&initialised, 1); /* prevent wrap-around */ + + while (apr_atomic_read32(&in_init)) /* wait until we get fully inited */ + ; + } + else { apr_pool_t *parent; /* Top level pool scope, need process-scope lifetime */ @@ -133,6 +140,8 @@ apr_pool_cleanup_register(pool, NULL, dbm_term, apr_pool_cleanup_null); + + apr_atomic_dec32(&in_init); } rv = apu_dso_mutex_lock();