Check out this PR: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20462
plog is created after pconf which means that plog will be cleaned up before pconf during destroy_and_exit_process() called during shutdown. It is not uncommon for modules to register cleanups against pconf and log messages during these cleanups. Since plog has already been cleaned up, nasty things can happen. But...
some of the nastiness reported in the PR may come from improper use of cleanups. If a single module registers multiple cleanups against pconf and those cleanups have dependencies on each other, well, you reap what you sow.
Comments b4 I commit this to 2.1?
Index: include/httpd.h =================================================================== RCS file: /home/cvs/httpd-2.0/include/httpd.h,v retrieving revision 1.191.2.7 diff -u -r1.191.2.7 httpd.h --- include/httpd.h 24 Nov 2003 16:07:52 -0000 1.191.2.7 +++ include/httpd.h 11 Dec 2003 05:40:12 -0000 @@ -704,6 +704,8 @@ const char * const *argv; /** The program name used to execute the program */ const char *short_name; + /** Logging pool. Cleared after each config read */ + apr_pool_t *plog; };
/** A structure that represents the current request */ Index: server/main.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/main.c,v retrieving revision 1.140.2.3 diff -u -r1.140.2.3 main.c --- server/main.c 27 Feb 2003 12:09:44 -0000 1.140.2.3 +++ server/main.c 11 Dec 2003 05:40:14 -0000 @@ -276,6 +276,12 @@
process = apr_palloc(cntx, sizeof(process_rec)); process->pool = cntx; + /* The plog pool needs to hang around until the very end because + * modules may be logging messages in cleanups registered against + * pconf. + */ + apr_pool_create(&process->plog, process->pool); + apr_pool_tag(process->plog, "plog");
apr_pool_create(&process->pconf, process->pool); apr_pool_tag(process->pconf, "pconf"); @@ -428,6 +434,8 @@ process = create_process(argc, argv); pglobal = process->pool; pconf = process->pconf; + plog = process->plog; + ap_server_argv0 = process->short_name;
#if APR_CHARSET_EBCDIC @@ -556,8 +564,7 @@ usage(process); }
- apr_pool_create(&plog, pglobal); - apr_pool_tag(plog, "plog"); + apr_pool_create(&ptemp, pconf); apr_pool_tag(ptemp, "ptemp");