dougm 00/08/20 20:01:31
Modified: lib/Apache Build.pm
lib/ModPerl Code.pm
pod modperl_dev.pod
src/modules/perl mod_perl.c mod_perl.h modperl_callback.c
modperl_callback.h modperl_config.c
Log:
pass arguments to callbacks
add PerlResponseHandler
Revision Changes Path
1.22 +1 -1 modperl-2.0/lib/Apache/Build.pm
Index: Build.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/Apache/Build.pm,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- Build.pm 2000/06/20 16:04:21 1.21
+++ Build.pm 2000/08/21 03:01:27 1.22
@@ -104,7 +104,7 @@
if ($self->{MP_DEBUG}) {
$self->{MP_TRACE} = 1;
- $ccopts .= " -g";
+ $ccopts .= " -g -DMP_DEBUG";
}
if ($self->{MP_CCOPTS}) {
1.34 +7 -3 modperl-2.0/lib/ModPerl/Code.pm
Index: Code.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- Code.pm 2000/08/14 03:10:44 1.33
+++ Code.pm 2000/08/21 03:01:28 1.34
@@ -13,13 +13,15 @@
PerSrv => [qw(PostReadRequest Trans)], #Init
PerDir => [qw(HeaderParser
Access Authen Authz
- Type Fixup Log)], #Init Response Cleanup
+ Type Fixup Response Log)], #Init Cleanup
Connection => [qw(PreConnection ProcessConnection)],
);
my %hooks = map { $_, canon_lc($_) }
map { @{ $handlers{$_} } } keys %handlers;
+my %not_ap_hook = map { $_, 1 } qw(response);
+
my %hook_proto = (
Process => {
ret => 'void',
@@ -165,7 +167,8 @@
if (my $hook = $hooks{$handler}) {
push @register_hooks,
- " ap_hook_$hook($name, NULL, NULL, AP_HOOK_LAST);";
+ " ap_hook_$hook($name, NULL, NULL, AP_HOOK_LAST);"
+ unless $not_ap_hook{$hook};
}
my($protostr, $pass) = canon_proto($prototype, $name);
@@ -439,7 +442,8 @@
generate_trace => {h => 'modperl_trace.h'},
);
-my @c_src_names = qw(interp tipool log config options callback gtop);
+my @c_src_names = qw(interp tipool log config options callback gtop
+ util apache_xs);
my @g_c_names = map { "modperl_$_" } qw(hooks directives flags xsinit);
my @c_names = ('mod_perl', (map "modperl_$_", @c_src_names));
sub c_files { [map { "$_.c" } @c_names, @g_c_names] }
1.5 +2 -0 modperl-2.0/pod/modperl_dev.pod
Index: modperl_dev.pod
===================================================================
RCS file: /home/cvs/modperl-2.0/pod/modperl_dev.pod,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- modperl_dev.pod 2000/06/20 16:04:33 1.4
+++ modperl_dev.pod 2000/08/21 03:01:29 1.5
@@ -114,6 +114,8 @@
=item PerlFixupHandler
+=item PerlResponseHandler
+
=item PerlLogHandler
=item PerlPostReadRequestHandler
1.21 +5 -0 modperl-2.0/src/modules/perl/mod_perl.c
Index: mod_perl.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- mod_perl.c 2000/08/14 03:10:45 1.20
+++ mod_perl.c 2000/08/21 03:01:30 1.21
@@ -153,6 +153,11 @@
};
static handler_rec modperl_handlers[] = {
+#if 0
+ { "perl-script", modperl_1xx_response_handler },
+#endif
+ /* this response handler does not do any extra crap */
+ { "modperl", modperl_response_handler },
{ NULL },
};
1.19 +4 -0 modperl-2.0/src/modules/perl/mod_perl.h
Index: mod_perl.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- mod_perl.h 2000/08/14 03:10:45 1.18
+++ mod_perl.h 2000/08/21 03:01:30 1.19
@@ -24,6 +24,9 @@
#include "apr_lock.h"
#include "apr_strings.h"
+#include "ap_buckets.h"
+#include "util_filter.h"
+
extern module MODULE_VAR_EXPORT perl_module;
#include "modperl_flags.h"
@@ -33,6 +36,7 @@
#include "modperl_gtop.h"
#endif
#include "modperl_types.h"
+#include "modperl_util.h"
#include "modperl_config.h"
#include "modperl_callback.h"
#include "modperl_tipool.h"
1.14 +89 -11 modperl-2.0/src/modules/perl/modperl_callback.c
Index: modperl_callback.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_callback.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- modperl_callback.c 2000/08/14 03:10:45 1.13
+++ modperl_callback.c 2000/08/21 03:01:30 1.14
@@ -31,11 +31,35 @@
};
apr_register_cleanup(p, (void*)handler,
- modperl_handler_cleanup, apr_null_cleanup);
+ modperl_handler_cleanup, apr_null_cleanup);
return handler;
}
+void modperl_handler_make_args(pTHX_ AV *av, ...)
+{
+ va_list args;
+
+ va_start(args, av);
+
+ for (;;) {
+ char *classname = va_arg(args, char *);
+ void *ptr;
+ SV *sv;
+
+ if (classname == NULL) {
+ break;
+ }
+
+ ptr = va_arg(args, void *);
+
+ sv = modperl_ptr2obj(aTHX_ classname, ptr);
+ av_push(av, sv);
+ }
+
+ va_end(args);
+}
+
apr_status_t modperl_handler_cleanup(void *data)
{
modperl_handler_t *handler = (modperl_handler_t *)data;
@@ -130,11 +154,13 @@
MpHandlerFLAGS(handler) = 0;
handler->cvgen = 0;
+#if 0
if (handler->args) {
av_clear(handler->args);
SvREFCNT_dec((SV*)handler->args);
handler->args = Nullav;
}
+#endif
if (handler->cv) {
SvREFCNT_dec(handler->cv);
handler->cv = Nullsv;
@@ -238,6 +264,9 @@
modperl_handler_t *new_handler =
modperl_handler_new(p, (void*)handler->name,
MP_HANDLER_TYPE_CHAR);
+
+ new_handler->args = handler->args;
+ handler->args = Nullav;
handler = new_handler;
}
#endif
@@ -262,7 +291,7 @@
EXTEND(SP, len);
for (i=0; i<=len; i++) {
- PUSHs(sv_2mortal(*av_fetch(handler->args, i, FALSE)));
+ PUSHs(*av_fetch(handler->args, i, FALSE));
}
}
@@ -295,14 +324,8 @@
return status;
}
-#define MP_HANDLER_TYPE_DIR 1
-#define MP_HANDLER_TYPE_SRV 2
-#define MP_HANDLER_TYPE_CONN 3
-#define MP_HANDLER_TYPE_PROC 4
-#define MP_HANDLER_TYPE_FILE 5
-
int modperl_run_handlers(int idx, request_rec *r, conn_rec *c,
- server_rec *s, int type)
+ server_rec *s, int type, ...)
{
#ifdef USE_ITHREADS
pTHX;
@@ -315,6 +338,8 @@
MpAV *av = NULL;
int i, status = OK;
const char *desc = NULL;
+ va_list args;
+ AV *av_args = Nullav;
if (!MpSrvENABLED(scfg)) {
MP_TRACE_h(MP_FUNC, "PerlOff for server %s\n",
@@ -367,13 +392,65 @@
MP_TRACE_h(MP_FUNC, "running %d %s handlers\n",
av->nelts, desc);
handlers = (modperl_handler_t **)av->elts;
+ av_args = newAV();
+
+ switch (type) {
+ case MP_HANDLER_TYPE_DIR:
+ case MP_HANDLER_TYPE_SRV:
+ modperl_handler_make_args(aTHX_ av_args,
+ "Apache", r, NULL);
+ break;
+ case MP_HANDLER_TYPE_CONN:
+ modperl_handler_make_args(aTHX_ av_args,
+ "Apache::Connection", c, NULL);
+ break;
+ case MP_HANDLER_TYPE_FILE:
+ {
+ apr_pool_t *pconf, *plog, *ptemp;
+ va_start(args, type);
+ pconf = va_arg(args, apr_pool_t *);
+ plog = va_arg(args, apr_pool_t *);
+ ptemp = va_arg(args, apr_pool_t *);
+ va_end(args);
+
+ modperl_handler_make_args(aTHX_ av_args,
+ "Apache::Pool", pconf,
+ "Apache::Pool", plog,
+ "Apache::Pool", ptemp,
+ "Apache::Server", s, NULL);
+ }
+ break;
+ case MP_HANDLER_TYPE_PROC:
+ {
+ apr_pool_t *p;
+
+ va_start(args, type);
+ p = va_arg(args, apr_pool_t *);
+ va_end(args);
+
+ modperl_handler_make_args(aTHX_ av_args,
+ "Apache::Pool", p,
+ "Apache::Server", s, NULL);
+ }
+ break;
+ };
+
for (i=0; i<av->nelts; i++) {
+ if (!handlers[i]->perl) {
+ handlers[i]->perl = aTHX;
+ }
+
+ handlers[i]->args = av_args;
status = modperl_callback(aTHX_ handlers[i], p);
+ handlers[i]->args = Nullav;
+
MP_TRACE_h(MP_FUNC, "%s returned %d\n",
handlers[i]->name, status);
}
+ SvREFCNT_dec((SV*)av_args);
+
#ifdef USE_ITHREADS
if (interp && MpInterpPUTBACK_On(interp)) {
/* XXX: might want to put interp back into available pool
@@ -404,12 +481,13 @@
void modperl_process_callback(int idx, apr_pool_t *p, server_rec *s)
{
- modperl_run_handlers(idx, NULL, NULL, s, MP_HANDLER_TYPE_PROC);
+ modperl_run_handlers(idx, NULL, NULL, s, MP_HANDLER_TYPE_PROC, p);
}
void modperl_files_callback(int idx,
apr_pool_t *pconf, apr_pool_t *plog,
apr_pool_t *ptemp, server_rec *s)
{
- modperl_run_handlers(idx, NULL, NULL, s, MP_HANDLER_TYPE_FILE);
+ modperl_run_handlers(idx, NULL, NULL, s, MP_HANDLER_TYPE_FILE,
+ pconf, plog, ptemp);
}
1.9 +9 -1 modperl-2.0/src/modules/perl/modperl_callback.h
Index: modperl_callback.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_callback.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- modperl_callback.h 2000/08/14 03:10:45 1.8
+++ modperl_callback.h 2000/08/21 03:01:30 1.9
@@ -10,8 +10,16 @@
#define ap_hook_fixup ap_hook_fixups
#define ap_hook_log ap_hook_log_transaction
+#define MP_HANDLER_TYPE_DIR 1
+#define MP_HANDLER_TYPE_SRV 2
+#define MP_HANDLER_TYPE_CONN 3
+#define MP_HANDLER_TYPE_PROC 4
+#define MP_HANDLER_TYPE_FILE 5
+
modperl_handler_t *modperl_handler_new(apr_pool_t *p, void *h, int type);
+void modperl_handler_make_args(pTHX_ AV *avp, ...);
+
apr_status_t modperl_handler_cleanup(void *data);
void modperl_handler_cache_cv(pTHX_ modperl_handler_t *handler, CV *cv);
@@ -26,7 +34,7 @@
int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p);
int modperl_run_handlers(int idx, request_rec *r, conn_rec *c,
- server_rec *s, int type);
+ server_rec *s, int type, ...);
void modperl_process_callback(int idx, apr_pool_t *p, server_rec *s);
1.15 +1 -1 modperl-2.0/src/modules/perl/modperl_config.c
Index: modperl_config.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- modperl_config.c 2000/08/14 03:10:45 1.14
+++ modperl_config.c 2000/08/21 03:01:30 1.15
@@ -6,7 +6,7 @@
modperl_handler_t *h = modperl_handler_new(p, (void*)name,
MP_HANDLER_TYPE_CHAR);
if (!*handlers) {
- *handlers = apr_make_array(p, sizeof(modperl_handler_t), 1);
+ *handlers = apr_make_array(p, 1, sizeof(modperl_handler_t *));
MP_TRACE_d(MP_FUNC, "created handler stack\n");
}