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;
}