patch to pool debugging to display the pool_creation and it's children when you destroy them BTW.. should the global pool be tagged as 'global'?
..Ian
the reason I'm posting is i'm not sure if there is a better way to open up the stderr log to print the stuff out.
Index: include/apr_pools.h =================================================================== RCS file: /home/cvs/apr/include/apr_pools.h,v retrieving revision 1.66 diff -u -r1.66 apr_pools.h --- include/apr_pools.h 1 Jan 2002 23:49:23 -0000 1.66 +++ include/apr_pools.h 11 Jan 2002 20:07:28 -0000 @@ -92,8 +92,8 @@ * NB These should ALL normally be commented out unless you REALLY * need them!! */ -/* #define APR_POOL_DEBUG +/* */
#define APR_POOL_STRINGIZE(x) APR_POOL__STRINGIZE(x)
@@ -158,11 +158,23 @@
* (this flag only makes sense in combination with POOL_FNEW_ALLOCATOR)
*
*/
+#if defined(APR_POOL_DEBUG)
+#define apr_pool_create_ex( newpool, parent, abort_fn, flag) \
+ apr_pool_create_ex_dbg( newpool, parent, abort_fn, flag,__FILE__,__LINE__)
+
+APR_DECLARE(apr_status_t) apr_pool_create_ex_dbg(apr_pool_t **newpool,
+ apr_pool_t *parent,
+ apr_abortfunc_t abort_fn,
+ apr_uint32_t flags,
+ const char *file,
+ int line);
+#
+#else
APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool,
apr_pool_t *parent,
apr_abortfunc_t abort_fn,
apr_uint32_t flags);
-
+#endif
/**
* Create a new pool.
* @param newpool The pool we have just created.
Index: memory/unix/apr_pools.c
===================================================================
RCS file: /home/cvs/apr/memory/unix/apr_pools.c,v
retrieving revision 1.127
diff -u -r1.127 apr_pools.c
--- memory/unix/apr_pools.c 10 Jan 2002 18:52:49 -0000 1.127
+++ memory/unix/apr_pools.c 11 Jan 2002 20:07:28 -0000
@@ -91,6 +91,12 @@
#define APR_ALIGN_DEFAULT(size) APR_ALIGN(size, 8)
+/* + * This option prints out the pool creation info + * (and info about its children) + * when the pool is destroyed. + */ +#define APR_POOL_DEBUG_VERBOSE
/* * Structures @@ -161,6 +167,8 @@
#else /* !defined(APR_POOL_DEBUG) */ debug_node_t *nodes; + const char *file; + int line; #if APR_HAS_THREADS apr_thread_mutex_t *mutex; #endif @@ -887,6 +895,9 @@ return mem; }
+/*
+ * (debug)
+ */
APR_DECLARE(void *) apr_pcalloc(apr_pool_t *pool, apr_size_t size)
{
void *mem;
@@ -934,9 +945,32 @@
free(node);
}
}
-
+/*
+ * destroy (debug)
+ */
APR_DECLARE(void) apr_pool_destroy(apr_pool_t *pool)
{
+#if defined APR_POOL_DEBUG_VERBOSE
+ apr_file_t *stderr_log=NULL;
+ apr_pool_t *child;
+
+ apr_file_open_stderr(&stderr_log,pool); /* XXX not sure about this one */
+ if (stderr_log) {
+ apr_file_printf(stderr_log,
+ "DEBUG: destroy pool tagged %s created %s:%d\n",
+ pool->tag, pool->file, pool->line);
+ child= pool->child;
+ while (child) {
+ apr_file_printf(stderr_log,
+ "DEBUG:\tpool child tagged %s created %s:%d\n",
+ child->tag, child->file, child->line);
+ child=child->sibling;
+ }
+ apr_file_close(stderr_log);
+ }
+#endif
+
+
apr_pool_clear(pool);
/* Remove the pool from the parents child list */ @@ -961,10 +995,16 @@ free(pool); }
-APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool, +/* + * create (debug) + * there is a macro which adds the file/line # + */ +APR_DECLARE(apr_status_t) apr_pool_create_ex_dbg(apr_pool_t **newpool, apr_pool_t *parent, apr_abortfunc_t abort_fn, - apr_uint32_t flags) + apr_uint32_t flags, + const char *file, + int line) { apr_pool_t *pool;
@@ -1027,6 +1067,9 @@ pool->sibling = NULL; pool->ref = NULL; } + + pool->file = file; + pool->line = line;
*newpool = pool;
Index: include/apr_pools.h =================================================================== RCS file: /home/cvs/apr/include/apr_pools.h,v retrieving revision 1.66 diff -u -r1.66 apr_pools.h --- include/apr_pools.h 1 Jan 2002 23:49:23 -0000 1.66 +++ include/apr_pools.h 11 Jan 2002 20:07:28 -0000 @@ -92,8 +92,8 @@ * NB These should ALL normally be commented out unless you REALLY * need them!! */ -/* #define APR_POOL_DEBUG +/* */ #define APR_POOL_STRINGIZE(x) APR_POOL__STRINGIZE(x) @@ -158,11 +158,23 @@ * (this flag only makes sense in combination with POOL_FNEW_ALLOCATOR) * */ +#if defined(APR_POOL_DEBUG) +#define apr_pool_create_ex( newpool, parent, abort_fn, flag) \ + apr_pool_create_ex_dbg( newpool, parent, abort_fn, flag,__FILE__,__LINE__) + +APR_DECLARE(apr_status_t) apr_pool_create_ex_dbg(apr_pool_t **newpool, + apr_pool_t *parent, + apr_abortfunc_t abort_fn, + apr_uint32_t flags, + const char *file, + int line); +# +#else APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool, apr_pool_t *parent, apr_abortfunc_t abort_fn, apr_uint32_t flags); - +#endif /** * Create a new pool. * @param newpool The pool we have just created. Index: memory/unix/apr_pools.c =================================================================== RCS file: /home/cvs/apr/memory/unix/apr_pools.c,v retrieving revision 1.127 diff -u -r1.127 apr_pools.c --- memory/unix/apr_pools.c 10 Jan 2002 18:52:49 -0000 1.127 +++ memory/unix/apr_pools.c 11 Jan 2002 20:07:28 -0000 @@ -91,6 +91,12 @@ #define APR_ALIGN_DEFAULT(size) APR_ALIGN(size, 8) +/* + * This option prints out the pool creation info + * (and info about its children) + * when the pool is destroyed. + */ +#define APR_POOL_DEBUG_VERBOSE /* * Structures @@ -161,6 +167,8 @@ #else /* !defined(APR_POOL_DEBUG) */ debug_node_t *nodes; + const char *file; + int line; #if APR_HAS_THREADS apr_thread_mutex_t *mutex; #endif @@ -887,6 +895,9 @@ return mem; } +/* + * (debug) + */ APR_DECLARE(void *) apr_pcalloc(apr_pool_t *pool, apr_size_t size) { void *mem; @@ -934,9 +945,32 @@ free(node); } } - +/* + * destroy (debug) + */ APR_DECLARE(void) apr_pool_destroy(apr_pool_t *pool) { +#if defined APR_POOL_DEBUG_VERBOSE + apr_file_t *stderr_log=NULL; + apr_pool_t *child; + + apr_file_open_stderr(&stderr_log,pool); /* XXX not sure about this one */ + if (stderr_log) { + apr_file_printf(stderr_log, + "DEBUG: destroy pool tagged %s created %s:%d\n", + pool->tag, pool->file, pool->line); + child= pool->child; + while (child) { + apr_file_printf(stderr_log, + "DEBUG:\tpool child tagged %s created %s:%d\n", + child->tag, child->file, child->line); + child=child->sibling; + } + apr_file_close(stderr_log); + } +#endif + + apr_pool_clear(pool); /* Remove the pool from the parents child list */ @@ -961,10 +995,16 @@ free(pool); } -APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool, +/* + * create (debug) + * there is a macro which adds the file/line # + */ +APR_DECLARE(apr_status_t) apr_pool_create_ex_dbg(apr_pool_t **newpool, apr_pool_t *parent, apr_abortfunc_t abort_fn, - apr_uint32_t flags) + apr_uint32_t flags, + const char *file, + int line) { apr_pool_t *pool; @@ -1027,6 +1067,9 @@ pool->sibling = NULL; pool->ref = NULL; } + + pool->file = file; + pool->line = line; *newpool = pool;