coar 97/05/05 13:41:57
Modified: src/modules/example mod_example.c
Log:
D'oh! Redid the r->request_config stuff; since the trace is
a string, the r->notes table is a fine place to keep it - and
it gets maintained properly across the main and sub-requests.
(Right, Dean?)
Revision Changes Path
1.10 +22 -47 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.9
retrieving revision 1.10
diff -C3 -r1.9 -r1.10
*** mod_example.c 1997/05/05 10:47:08 1.9
--- mod_example.c 1997/05/05 20:41:55 1.10
***************
*** 312,331 ****
*
* If the call occurs within a request context (i.e., we're passed a request
* record), we put the trace into the request pool and attach it to the
! * request via the request_config mechanism. Otherwise, the trace gets
added
! * to the static (non-request-specific) list.
*
! * Note that this method is not a formal part of the API. The use of the
! * request_config field in the request_rec record is not currently defined.
! * However, the only defined method of maintaining per-request information,
! * the r->notes table, is string-oriented and can't conveniently handle
! * arbitrary data.
! *
! * In any other context, what we're doing here - accessing components
outside
! * our scope, like the main request - would be considered a technical
! * violation of the API. However, we can do what we want with undefined
! * aspects, as long as we're prepared for them to have undefined results.
*/
static void trace_add
(server_rec *s, request_rec *r, example_config *mconfig,
const char *note) {
--- 312,327 ----
*
* If the call occurs within a request context (i.e., we're passed a request
* record), we put the trace into the request pool and attach it to the
! * request via the notes mechanism. Otherwise, the trace gets added
! * to the static (non-request-specific) list.
*
! * Note that the r->notes table is only for storing strings; if you need to
! * maintain per-request data of any other type, you need to use another
! * mechanism.
*/
+
+ #define TRACE_NOTE "example-trace"
+
static void trace_add
(server_rec *s, request_rec *r, example_config *mconfig,
const char *note) {
***************
*** 334,342 ****
char *addon;
char *where;
pool *p;
! char **ctrace;
! request_rec
! *req = r;
example_config
*rconfig;
--- 330,336 ----
char *addon;
char *where;
pool *p;
! char *trace_copy;
example_config
*rconfig;
***************
*** 348,380 ****
* Now, if we're in request-context, we use the request pool.
*/
if (r != NULL) {
! /*
! * Make sure that we're storing our trace in the main request; we want
! * to track all activities for subrequests as well.
! */
! if (req->main != NULL) {
! req = req->main;
}
- p = req->pool;
- /*
- * Find our per-request configuration record, which holds the trace
- * of activities specific to the request itself.
- */
- rconfig = (example_config *) get_module_config
- (req->request_config, &example_module);
- /*
- * If there isn't one, create one and add it.
- */
- if (rconfig == NULL) {
- rconfig = pcalloc (req->pool, sizeof(example_config));
- set_module_config (req->request_config, &example_module, rconfig);
- rconfig->trace = NULL;
- }
- /*
- * Note that the trace data from this call go into the per-request
- * list, not the static one.
- */
- ctrace = &rconfig->trace;
} else {
/*
* We're not in request context, so the trace gets attached to our
--- 342,351 ----
* Now, if we're in request-context, we use the request pool.
*/
if (r != NULL) {
! p = r->pool;
! if ((trace_copy = table_get (r->notes, TRACE_NOTE)) == NULL) {
! trace_copy = "";
}
} else {
/*
* We're not in request context, so the trace gets attached to our
***************
*** 398,404 ****
destroy_pool (example_subpool);
}
example_subpool = p;
! ctrace = &trace;
}
/*
* If we weren't passed a configuration record, we can't figure out to
--- 369,375 ----
destroy_pool (example_subpool);
}
example_subpool = p;
! trace_copy = trace;
}
/*
* If we weren't passed a configuration record, we can't figure out to
***************
*** 414,420 ****
* this particular combination before. The table is allocated in the
* module's private pool, which doesn't get destroyed.
*/
! if (req == NULL) {
char *key;
key = pstrcat (p, note, ":", where, NULL);
--- 385,391 ----
* this particular combination before. The table is allocated in the
* module's private pool, which doesn't get destroyed.
*/
! if (r == NULL) {
char *key;
key = pstrcat (p, note, ":", where, NULL);
***************
*** 448,455 ****
" </LI>\n",
NULL
);
! sofar = (*ctrace == NULL) ? "" : *ctrace;
! *ctrace = pstrcat (p, sofar, addon, NULL);
/*
* You *could* uncomment the following if you wanted to see the calling
* sequence reported in the server's error_log, but beware - almost all
of
--- 419,431 ----
" </LI>\n",
NULL
);
! sofar = (trace_copy == NULL) ? "" : trace_copy;
! trace_copy = pstrcat (p, sofar, addon, NULL);
! if (r != NULL) {
! table_set (r->notes, TRACE_NOTE, trace_copy);
! } else {
! trace = trace_copy;
! }
/*
* You *could* uncomment the following if you wanted to see the calling
* sequence reported in the server's error_log, but beware - almost all
of
***************
*** 533,539 ****
*rcfg;
dcfg = our_dconfig (r);
- rcfg = our_rconfig (r);
trace_add (r->server, r, dcfg, "example_handler()");
/*
* We're about to start sending content, so we need to force the HTTP
--- 509,514 ----
***************
*** 603,609 ****
(
r,
" <H2>Request-specific callbacks so far:</H2>\n <OL>\n%s
</OL>\n",
! rcfg->trace
);
rputs (" <H2>Environment for <EM>this</EM> call:</H2>\n", r);
rputs (" <UL>\n", r);
--- 578,584 ----
(
r,
" <H2>Request-specific callbacks so far:</H2>\n <OL>\n%s
</OL>\n",
! table_get (r->notes, TRACE_NOTE)
);
rputs (" <H2>Environment for <EM>this</EM> call:</H2>\n", r);
rputs (" <UL>\n", r);