Index: subversion/libsvn_fs_base/bdb/env.c =================================================================== --- subversion/libsvn_fs_base/bdb/env.c (revision 24300) +++ subversion/libsvn_fs_base/bdb/env.c (working copy) @@ -355,12 +355,12 @@ static volatile svn_atomic_t bdb_cache_state; static svn_error_t * -bdb_init_cb(void) +bdb_init_cb(apr_pool_t *pool) { #if APR_HAS_THREADS apr_status_t apr_err; #endif - bdb_cache_pool = svn_pool_create(NULL); + bdb_cache_pool = svn_pool_create(pool); bdb_cache = apr_hash_make(bdb_cache_pool); #if APR_HAS_THREADS apr_err = apr_thread_mutex_create(&bdb_cache_lock, @@ -380,9 +380,9 @@ } svn_error_t * -svn_fs_bdb__init(void) +svn_fs_bdb__init(apr_pool_t* pool) { - SVN_ERR(svn_atomic__init_once(&bdb_cache_state, bdb_init_cb)); + SVN_ERR(svn_atomic__init_once(&bdb_cache_state, bdb_init_cb, pool)); return SVN_NO_ERROR; } Index: subversion/libsvn_fs_base/bdb/env.h =================================================================== --- subversion/libsvn_fs_base/bdb/env.h (revision 24300) +++ subversion/libsvn_fs_base/bdb/env.h (working copy) @@ -102,7 +102,7 @@ /* Iniitalize the BDB back-end's private stuff. */ -svn_error_t *svn_fs_bdb__init(void); +svn_error_t *svn_fs_bdb__init(apr_pool_t* pool); /* Allocate the Berkeley DB descriptor BDB and open the environment. Index: subversion/libsvn_fs_base/fs.c =================================================================== --- subversion/libsvn_fs_base/fs.c (revision 24300) +++ subversion/libsvn_fs_base/fs.c (working copy) @@ -1258,7 +1258,7 @@ svn_error_t * svn_fs_base__init(const svn_version_t *loader_version, - fs_library_vtable_t **vtable) + fs_library_vtable_t **vtable, apr_pool_t* pool) { static const svn_version_checklist_t checklist[] = { @@ -1275,7 +1275,7 @@ loader_version->major); SVN_ERR(svn_ver_check_list(base_version(), checklist)); SVN_ERR(check_bdb_version()); - SVN_ERR(svn_fs_bdb__init()); + SVN_ERR(svn_fs_bdb__init(pool)); *vtable = &library_vtable; return SVN_NO_ERROR; Index: subversion/include/private/svn_atomic.h =================================================================== --- subversion/include/private/svn_atomic.h (revision 24300) +++ subversion/include/private/svn_atomic.h (working copy) @@ -106,7 +106,7 @@ */ svn_error_t * svn_atomic__init_once(volatile svn_atomic_t *global_status, - svn_error_t *(*init_func)(void)); + svn_error_t *(*init_func)(apr_pool_t*), apr_pool_t* pool); #ifdef __cplusplus } Index: subversion/libsvn_fs/fs-loader.h =================================================================== --- subversion/libsvn_fs/fs-loader.h (revision 24300) +++ subversion/libsvn_fs/fs-loader.h (working copy) @@ -105,15 +105,15 @@ ### need to force this to be __cdecl on Windows... how?? */ typedef svn_error_t *(*fs_init_func_t)(const svn_version_t *loader_version, - fs_library_vtable_t **vtable); + fs_library_vtable_t **vtable, apr_pool_t* pool); /* Here are the declarations for the FS module init functions. If we are using DSO loading, they won't actually be linked into libsvn_fs. */ svn_error_t *svn_fs_base__init(const svn_version_t *loader_version, - fs_library_vtable_t **vtable); + fs_library_vtable_t **vtable, apr_pool_t* pool); svn_error_t *svn_fs_fs__init(const svn_version_t *loader_version, - fs_library_vtable_t **vtable); + fs_library_vtable_t **vtable, apr_pool_t* pool); Index: subversion/libsvn_fs/fs-loader.c =================================================================== --- subversion/libsvn_fs/fs-loader.c (revision 24300) +++ subversion/libsvn_fs/fs-loader.c (working copy) @@ -131,7 +131,24 @@ _("Failed to load module for FS type '%s'"), fst->fs_type); - SVN_ERR(initfunc(my_version, vtable)); + { + apr_status_t status; + svn_error_t* err; + + /* Invoke the FS module's initfunc function with the common + pool protected by a lock. */ +#if APR_HAS_THREADS + status = apr_thread_mutex_lock(common_pool_lock); + if (status) + return svn_error_wrap_apr(status, _("Can't grab FS mutex")); +#endif + SVN_ERR(initfunc(my_version, vtable, common_pool)); +#if APR_HAS_THREADS + status = apr_thread_mutex_unlock(common_pool_lock); + if (status && !err) + return svn_error_wrap_apr(status, _("Can't ungrab FS mutex")); +#endif + } fs_version = (*vtable)->get_version(); if (!svn_ver_equal(my_version, fs_version)) return svn_error_createf(SVN_ERR_VERSION_MISMATCH, NULL, Index: subversion/libsvn_subr/atomic.c =================================================================== --- subversion/libsvn_subr/atomic.c (revision 24300) +++ subversion/libsvn_subr/atomic.c (working copy) @@ -26,7 +26,7 @@ svn_error_t* svn_atomic__init_once(volatile svn_atomic_t *global_status, - svn_error_t *(*init_func)(void)) + svn_error_t *(*init_func)(apr_pool_t*), apr_pool_t* pool) { /* We have to call init_func exactly once. Because APR doesn't have statically-initialized mutexes, we implement a poor @@ -37,7 +37,7 @@ if (status == SVN_ATOMIC_UNINITIALIZED) { - svn_error_t *err = init_func(); + svn_error_t *err = init_func(pool); if (err) { #ifdef APR_HAS_THREADS Index: subversion/libsvn_fs_fs/fs.c =================================================================== --- subversion/libsvn_fs_fs/fs.c (revision 24300) +++ subversion/libsvn_fs_fs/fs.c (working copy) @@ -370,7 +370,7 @@ svn_error_t * svn_fs_fs__init(const svn_version_t *loader_version, - fs_library_vtable_t **vtable) + fs_library_vtable_t **vtable, apr_pool_t* pool) { static const svn_version_checklist_t checklist[] = {