coar 97/04/18 11:50:50
Modified: src/modules/example mod_example.c Log: Change the way in which memory for the trace information is being allocated; different pools are used for different phases, and data from previous phases were turning to unrecoverable sludge in various pools. Reviewed by: Ron Revision Changes Path 1.7 +51 -20 apache/src/modules/example/mod_example.c Index: mod_example.c =================================================================== RCS file: /export/home/cvs/apache/src/modules/example/mod_example.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C3 -r1.6 -r1.7 *** mod_example.c 1997/04/16 05:47:58 1.6 --- mod_example.c 1997/04/18 18:50:48 1.7 *************** *** 104,109 **** --- 104,118 ---- static char *trace = NULL; /* + * To avoid leaking memory from pools other than the per-request one, we + * allocate a module-private pool, and then use a sub-pool of that which gets + * freed each time we modify the trace. That way previous layers of trace + * data don't get lost. + */ + static pool *example_pool = NULL; + static pool *example_subpool = NULL; + + /* * Declare ourselves so the configuration routines can find and know us. * We'll fill it in at the end of the module. */ *************** *** 260,272 **** * be displayed by the example_handler() routine. */ static void trace_add ! (server_rec *s, pool *p, example_config *mconfig, const char *note) { char *sofar; char *addon; char *where; /* * If we weren't passed a configuration record, we can't figure out to * what location this call applies. This only happens for co-routines * that don't operate in a particular directory or server context. If we --- 269,297 ---- * be displayed by the example_handler() routine. */ static void trace_add ! (server_rec *s, example_config *mconfig, const char *note) { char *sofar; char *addon; char *where; + pool *subpool; /* + * Make a new sub-pool and copy any existing trace to it. + */ + subpool = make_sub_pool (example_pool); + if (trace != NULL) { + addon = pstrcat (subpool, trace, NULL); + } + /* + * Now, if we have a sub-pool from before, nuke it and replace with the + * one we just allocated. + */ + if (example_subpool != NULL) { + destroy_pool (example_subpool); + } + example_subpool = subpool; + /* * If we weren't passed a configuration record, we can't figure out to * what location this call applies. This only happens for co-routines * that don't operate in a particular directory or server context. If we *************** *** 277,283 **** where = (where != NULL) ? where : ""; addon = pstrcat ( ! p, " <DT><SAMP>", note, "</SAMP>\n </DT>\n", --- 302,308 ---- where = (where != NULL) ? where : ""; addon = pstrcat ( ! subpool, " <DT><SAMP>", note, "</SAMP>\n </DT>\n", *************** *** 287,300 **** NULL ); sofar = (trace == NULL) ? "" : trace; ! trace = pstrcat (p, sofar, addon, NULL); /* * Store a copy of the same information in the configuration record, if * there is one. */ if (mconfig != NULL) { sofar = (mconfig->trace == NULL) ? "" : mconfig->trace; ! mconfig->trace = pstrcat (p, sofar, addon, NULL); } /* * You *could* uncomment the following if you wanted to see the calling --- 312,325 ---- NULL ); sofar = (trace == NULL) ? "" : trace; ! trace = pstrcat (subpool, sofar, addon, NULL); /* * Store a copy of the same information in the configuration record, if * there is one. */ if (mconfig != NULL) { sofar = (mconfig->trace == NULL) ? "" : mconfig->trace; ! mconfig->trace = pstrcat (subpool, sofar, addon, NULL); } /* * You *could* uncomment the following if you wanted to see the calling *************** *** 304,310 **** */ /* if (s != NULL) { ! log_printf(s, "mod_example: %s", note); } */ } --- 329,335 ---- */ /* if (s != NULL) { ! log_printf (s, "mod_example: %s", note); } */ } *************** *** 336,342 **** * "Example Wuz Here" */ cfg->local = 1; ! trace_add (cmd->server, cmd->pool, cfg, "cmd_example()"); return NULL; } --- 361,367 ---- * "Example Wuz Here" */ cfg->local = 1; ! trace_add (cmd->server, cfg, "cmd_example()"); return NULL; } *************** *** 371,377 **** *cfg; cfg = our_dconfig (r); ! trace_add (r->server, r->pool, cfg, "example_handler()"); /* * We're about to start sending content, so we need to force the HTTP * headers to be sent at this point. Otherwise, no headers will be sent --- 396,402 ---- *cfg; cfg = our_dconfig (r); ! trace_add (r->server, cfg, "example_handler()"); /* * We're about to start sending content, so we need to force the HTTP * headers to be sent at this point. Otherwise, no headers will be sent *************** *** 510,521 **** char *sname = s->server_hostname; /* * The arbitrary text we add to our trace entry indicates for which server * we're being called. */ sname = (sname != NULL) ? sname : ""; note = pstrcat (p, "example_init(", sname, ")", NULL); ! trace_add (s, p, NULL, note); } /* --- 535,552 ---- char *sname = s->server_hostname; /* + * If we haven't already allocated our module-private pool, do so now. + */ + if (example_pool == NULL) { + example_pool = make_sub_pool (NULL); + }; + /* * The arbitrary text we add to our trace entry indicates for which server * we're being called. */ sname = (sname != NULL) ? sname : ""; note = pstrcat (p, "example_init(", sname, ")", NULL); ! trace_add (s, NULL, note); } /* *************** *** 553,559 **** */ dname = (dname != NULL) ? dname : ""; cfg->loc = pstrcat (p, "DIR(", dname, ")", NULL); ! trace_add (NULL, p, cfg, "example_dir_create()"); return (void *) cfg; } --- 584,590 ---- */ dname = (dname != NULL) ? dname : ""; cfg->loc = pstrcat (p, "DIR(", dname, ")", NULL); ! trace_add (NULL, cfg, "example_dir_create()"); return (void *) cfg; } *************** *** 617,623 **** "\")", NULL ); ! trace_add (NULL, p, merged_config, note); return (void *) merged_config; } --- 648,654 ---- "\")", NULL ); ! trace_add (NULL, merged_config, note); return (void *) merged_config; } *************** *** 648,654 **** */ sname = (sname != NULL) ? sname : ""; cfg->loc = pstrcat (p, "SVR(", sname, ")", NULL); ! trace_add (s, p, cfg, "example_server_create()"); return (void *) cfg; } --- 679,685 ---- */ sname = (sname != NULL) ? sname : ""; cfg->loc = pstrcat (p, "SVR(", sname, ")", NULL); ! trace_add (s, cfg, "example_server_create()"); return (void *) cfg; } *************** *** 699,705 **** "\")", NULL ); ! trace_add (NULL, p, merged_config, note); return (void *) merged_config; } --- 730,736 ---- "\")", NULL ); ! trace_add (NULL, merged_config, note); return (void *) merged_config; } *************** *** 722,728 **** * We don't actually *do* anything here, except note the fact that we were * called. */ ! trace_add (r->server, r->pool, cfg, "example_xlate()"); return DECLINED; } --- 753,759 ---- * We don't actually *do* anything here, except note the fact that we were * called. */ ! trace_add (r->server, cfg, "example_xlate()"); return DECLINED; } *************** *** 745,751 **** /* * Don't do anything except log the call. */ ! trace_add (r->server, r->pool, cfg, "example_ckuser()"); return DECLINED; } --- 776,782 ---- /* * Don't do anything except log the call. */ ! trace_add (r->server, cfg, "example_ckuser()"); return DECLINED; } *************** *** 770,776 **** * Log the call and return OK, or access will be denied (even though we * didn't actually do anything). */ ! trace_add (r->server, r->pool, cfg, "example_ckauth()"); return OK; } --- 801,807 ---- * Log the call and return OK, or access will be denied (even though we * didn't actually do anything). */ ! trace_add (r->server, cfg, "example_ckauth()"); return OK; } *************** *** 790,796 **** *cfg; cfg = our_dconfig (r); ! trace_add (r->server, r->pool, cfg, "example_ckaccess()"); return OK; } --- 821,827 ---- *cfg; cfg = our_dconfig (r); ! trace_add (r->server, cfg, "example_ckaccess()"); return OK; } *************** *** 813,819 **** * Log the call, but don't do anything else - and report truthfully that * we didn't do anything. */ ! trace_add (r->server, r->pool, cfg, "example_typer()"); return DECLINED; } --- 844,850 ---- * Log the call, but don't do anything else - and report truthfully that * we didn't do anything. */ ! trace_add (r->server, cfg, "example_typer()"); return DECLINED; } *************** *** 835,841 **** /* * Log the call and exit. */ ! trace_add (r->server, r->pool, cfg, "example_fixer()"); return OK; } --- 866,872 ---- /* * Log the call and exit. */ ! trace_add (r->server, cfg, "example_fixer()"); return OK; } *************** *** 853,859 **** *cfg; cfg = our_dconfig (r); ! trace_add (r->server, r->pool, cfg, "example_logger()"); return DECLINED; } --- 884,890 ---- *cfg; cfg = our_dconfig (r); ! trace_add (r->server, cfg, "example_logger()"); return DECLINED; } *************** *** 872,878 **** *cfg; cfg = our_dconfig (r); ! trace_add (r->server, r->pool, cfg, "example_hparser()"); return DECLINED; } --- 903,909 ---- *cfg; cfg = our_dconfig (r); ! trace_add (r->server, cfg, "example_hparser()"); return DECLINED; }