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