Author: brane
Date: Thu Aug 7 06:19:52 2025
New Revision: 1927658
Log:
Fix pool debugging. With lifetime or owner checks enabled, pools couldn't
even be created, except for the global pool which is a special case.
* memory/unix/apr_pools.c
(struct apr_pool_t): Add an 'unmanaged' member for pool-debug mode.
The lifetime checks must be skipped for unmanaged pools, since they
inevitably fail: apr_pool_is_child_of() expects all pools to have a
parent, which obviously is not the case for unmanaged pools.
(apr_pool_create_ex_debug): Create the pool's mutex after the parent
has been assigned, because that involves an allocation which triggers
a lifetime check which ... well, see above.
(apr_pool_create_unmanaged): Set the pool->unmanaged flag and create the
pool's mutex after the owner and allocator have been assigned. A pool
without the owner set fails the ownershhip check, and without an
allocator it's sort of hard to allocate space for the mutex.
Modified:
apr/apr/trunk/memory/unix/apr_pools.c
Modified: apr/apr/trunk/memory/unix/apr_pools.c
==============================================================================
--- apr/apr/trunk/memory/unix/apr_pools.c Thu Aug 7 05:08:51 2025 (r1927657)
+++ apr/apr/trunk/memory/unix/apr_pools.c Thu Aug 7 06:19:52 2025 (r1927658)
@@ -600,6 +600,7 @@ struct apr_pool_t {
apr_os_thread_t owner;
apr_thread_mutex_t *mutex;
#endif /* APR_HAS_THREADS */
+ int unmanaged;
#endif /* APR_POOL_DEBUG */
#ifdef NETWARE
apr_os_proc_t owner_proc;
@@ -1619,7 +1620,8 @@ static void apr_pool_check_lifetime(apr_
* people have searched for the top level parent and
* started to use that...
*/
- if (pool == global_pool || global_pool == NULL)
+ if (pool == global_pool || global_pool == NULL
+ || (pool->parent == NULL && pool->unmanaged))
return;
/* Lifetime
@@ -2063,6 +2065,22 @@ APR_DECLARE(apr_status_t) apr_pool_creat
pool->owner_proc = (apr_os_proc_t)getnlmhandle();
#endif /* defined(NETWARE) */
+ if ((pool->parent = parent) != NULL) {
+ pool_lock(parent);
+
+ if ((pool->sibling = parent->child) != NULL)
+ pool->sibling->ref = &pool->sibling;
+
+ parent->child = pool;
+ pool->ref = &parent->child;
+
+ pool_unlock(parent);
+ }
+ else {
+ pool->sibling = NULL;
+ pool->ref = NULL;
+ }
+
#if APR_HAS_THREADS
if (parent == NULL || parent->allocator != allocator) {
apr_status_t rv;
@@ -2086,22 +2104,6 @@ APR_DECLARE(apr_status_t) apr_pool_creat
}
#endif /* APR_HAS_THREADS */
- if ((pool->parent = parent) != NULL) {
- pool_lock(parent);
-
- if ((pool->sibling = parent->child) != NULL)
- pool->sibling->ref = &pool->sibling;
-
- parent->child = pool;
- pool->ref = &parent->child;
-
- pool_unlock(parent);
- }
- else {
- pool->sibling = NULL;
- pool->ref = NULL;
- }
-
#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE)
apr_pool_log_event(pool, "CREATE", file_line, 1);
#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) */
@@ -2130,11 +2132,30 @@ APR_DECLARE(apr_status_t) apr_pool_creat
memset(pool, 0, SIZEOF_POOL_T);
+ pool->unmanaged = 1;
pool->abort_fn = abort_fn;
pool->tag = file_line;
pool->file_line = file_line;
#if APR_HAS_THREADS
+ pool->owner = apr_os_thread_current();
+#endif /* APR_HAS_THREADS */
+#ifdef NETWARE
+ pool->owner_proc = (apr_os_proc_t)getnlmhandle();
+#endif /* defined(NETWARE) */
+
+ if ((pool_allocator = allocator) == NULL) {
+ apr_status_t rv;
+ if ((rv = apr_allocator_create(&pool_allocator)) != APR_SUCCESS) {
+ if (abort_fn)
+ abort_fn(rv);
+ return rv;
+ }
+ pool_allocator->owner = pool;
+ }
+ pool->allocator = pool_allocator;
+
+#if APR_HAS_THREADS
{
apr_status_t rv;
@@ -2154,24 +2175,6 @@ APR_DECLARE(apr_status_t) apr_pool_creat
}
#endif /* APR_HAS_THREADS */
-#if APR_HAS_THREADS
- pool->owner = apr_os_thread_current();
-#endif /* APR_HAS_THREADS */
-#ifdef NETWARE
- pool->owner_proc = (apr_os_proc_t)getnlmhandle();
-#endif /* defined(NETWARE) */
-
- if ((pool_allocator = allocator) == NULL) {
- apr_status_t rv;
- if ((rv = apr_allocator_create(&pool_allocator)) != APR_SUCCESS) {
- if (abort_fn)
- abort_fn(rv);
- return rv;
- }
- pool_allocator->owner = pool;
- }
- pool->allocator = pool_allocator;
-
#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE)
apr_pool_log_event(pool, "CREATEU", file_line, 1);
#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) */
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.