dougm 00/04/18 15:59:15
Modified: lib/ModPerl Code.pm
src/modules/perl mod_perl.c modperl_callback.h
modperl_config.c modperl_config.h modperl_log.c
modperl_types.h
Log:
integrate with modperl_callback.c
beef up tracing support
Revision Changes Path
1.12 +43 -9 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.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- Code.pm 2000/04/17 21:11:06 1.11
+++ Code.pm 2000/04/18 22:59:13 1.12
@@ -49,12 +49,14 @@
{type => 'char', name => 'arg'}],
cfg => {get => 'MP_dSCFG(parms->server)',
name => 'scfg'},
+ scope => 'RSRC_CONF',
},
PerDir => {
args => [{type => 'cmd_parms', name => 'parms'},
{type => 'modperl_dir_config_t', name => 'dcfg'},
{type => 'char', name => 'arg'}],
cfg => {get => '', name => 'dcfg'},
+ scope => 'OR_ALL',
},
);
@@ -70,7 +72,7 @@
Srv => [qw(NONE PERL_TAINT_CHECK PERL_WARN FRESH_RESTART)],
Dir => [qw(NONE INCPUSH SENDHDR SENTHDR ENV CLEANUP RCLEANUP)],
Interp => [qw(NONE IN_USE PUTBACK CLONED)],
- Handler => [qw(NONE METHOD)],
+ Handler => [qw(NONE PARSED METHOD OBJECT ANON)],
);
sub new {
@@ -141,17 +143,27 @@
for my $h (@$handlers) {
my $name = canon_func('cmd', $h, 'handlers');
+ my $cmd_name = canon_define('cmd', $h, 'entry');
my $protostr = canon_proto($prototype, $name);
my $ix = $self->{handler_index}->{$class}->[$i++];
my $av = "$prototype->{cfg}->{name}->handlers[$ix]";
print $h_fh "$protostr;\n";
+
+ print $h_fh <<EOF;
+
+#define $cmd_name \\
+{"Perl${h}Handler", $name, NULL, \\
+ $prototype->{scope}, ITERATE, "Subroutine name"}
+
+EOF
print $c_fh <<EOF;
$protostr
{
$prototype->{cfg}->{get};
- return modperl_cmd_push_handlers($av, arg, parms->pool);
+ MP_TRACE_d(MP_FUNC, "push \@%s, %s\n", parms->cmd->name, arg);
+ return modperl_cmd_push_handlers(&($av), arg, parms->pool);
}
EOF
}
@@ -185,22 +197,34 @@
}
}
-my @trace = qw(d s h g c i m);
+my %trace = (
+# 'a' => 'all',
+ 'd' => 'directive processing',
+ 's' => 'perl sections',
+ 'h' => 'handlers',
+ 'm' => 'memory allocations',
+ 'i' => 'interpreter pool management',
+ 'g' => 'Perl runtime interaction',
+);
sub generate_trace {
my($self, $h_fh) = @_;
my $i = 1;
+ my @trace = sort keys %trace;
my $opts = join '', @trace;
+ my $tl = "MP_debug_level";
print $h_fh <<EOF;
-extern U32 MP_debug_level;
+extern U32 $tl;
#define MP_TRACE_OPTS "$opts"
#ifdef MP_TRACE
-#define MP_TRACE_a if (MP_debug_level) modperl_trace
-#define MP_TRACE_a_do(exp) if (MP_debug_level) exp
+#define MP_TRACE_a if ($tl) modperl_trace
+#define MP_TRACE_a_do(exp) if ($tl) { \\
+exp; \\
+}
#else
#define MP_TRACE_a if (0) modperl_trace
#define MP_TRACE_a_do(exp)
@@ -208,21 +232,31 @@
EOF
+ my @dumper;
for my $type (@trace) {
my $define = "#define MP_TRACE_$type";
my $define_do = join '_', $define, 'do';
print $h_fh <<EOF;
#ifdef MP_TRACE
-$define if (MP_debug_level & $i) modperl_trace
-$define_do(exp) if (MP_debug_level & $i) exp
+$define if ($tl & $i) modperl_trace
+$define_do(exp) if ($tl & $i) { \\
+exp; \\
+}
#else
$define if (0) modperl_trace
$define_do(exp)
#endif
EOF
+ push @dumper,
+ qq{fprintf(stderr, " $type %s ($trace{$type})\\n", ($tl & $i) ? "On " :
"Off");};
$i += $i;
}
+
+ print $h_fh join ' \\'."\n",
+ '#define MP_TRACE_dump_flags()',
+ qq{fprintf(stderr, "mod_perl trace flags dump:\\n");},
+ @dumper;
}
sub ins_underscore {
@@ -277,7 +311,7 @@
generate_trace => {h => 'modperl_trace.h'},
);
-my @c_src_names = qw(interp log config gtop);
+my @c_src_names = qw(interp log config callback gtop);
my @g_c_names = map { "modperl_$_" } qw(hooks directives xsinit);
my @c_names = ('mod_perl', (map "modperl_$_", @c_src_names), @g_c_names);
sub c_files { [map { "$_.c" } @c_names] }
1.9 +1 -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.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- mod_perl.c 2000/04/17 21:11:06 1.8
+++ mod_perl.c 2000/04/18 22:59:14 1.9
@@ -79,6 +79,7 @@
MP_SRV_CMD_TAKE1("PerlInterpMinSpare", interp_min_spare,
"Min number of spare Perl interpreters"),
#endif
+ MP_CMD_POST_READ_REQUEST_ENTRY,
{ NULL },
};
1.3 +15 -0 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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- modperl_callback.h 2000/04/14 23:52:54 1.2
+++ modperl_callback.h 2000/04/18 22:59:15 1.3
@@ -1,6 +1,21 @@
#ifndef MODPERL_CALLBACK_H
#define MODPERL_CALLBACK_H
+modperl_handler_t *modperl_handler_new(ap_pool_t *p, void *h, int type);
+
+ap_status_t modperl_handler_cleanup(void *data);
+
+void modperl_handler_cache_cv(pTHX_ modperl_handler_t *handler, CV *cv);
+
+int modperl_handler_lookup(pTHX_ modperl_handler_t *handler,
+ char *class, char *name);
+
+void modperl_handler_unparse(pTHX_ modperl_handler_t *handler);
+
+int modperl_handler_parse(pTHX_ modperl_handler_t *handler);
+
+int modperl_callback(pTHX_ modperl_handler_t *handler);
+
void modperl_process_callback(int idx, ap_pool_t *p, server_rec *s);
void modperl_files_callback(int idx,
1.7 +18 -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.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- modperl_config.c 2000/04/17 21:29:41 1.6
+++ modperl_config.c 2000/04/18 22:59:15 1.7
@@ -1,5 +1,22 @@
#include "mod_perl.h"
+char *modperl_cmd_push_handlers(MpAV **handlers, char *name, ap_pool_t *p)
+{
+ modperl_handler_t *h = modperl_handler_new(p, (void*)name,
+ MP_HANDLER_TYPE_CHAR);
+ if (!*handlers) {
+ *handlers = ap_make_array(p, sizeof(modperl_handler_t), 1);
+ MP_TRACE_d(MP_FUNC, "created handler stack\n");
+ }
+
+ /* XXX parse_handler if Perl is running */
+
+ *(modperl_handler_t **)ap_push_array(*handlers) = h;
+ MP_TRACE_d(MP_FUNC, "pushed handler: %s\n", h->name);
+
+ return NULL;
+}
+
void *modperl_create_dir_config(ap_pool_t *p, char *dir)
{
return NULL;
@@ -20,7 +37,7 @@
scfg->argv = ap_make_array(p, 2, sizeof(char *));
- scfg_push_argv(ap_server_argv0);
+ scfg_push_argv((char *)ap_server_argv0);
return scfg;
}
1.7 +1 -1 modperl-2.0/src/modules/perl/modperl_config.h
Index: modperl_config.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- modperl_config.h 2000/04/17 21:11:06 1.6
+++ modperl_config.h 2000/04/18 22:59:15 1.7
@@ -11,7 +11,7 @@
void *modperl_merge_srv_config(ap_pool_t *p, void *basev, void *addv);
-char *modperl_cmd_push_handlers(MpAV *handlers, char *name, ap_pool_t *p);
+char *modperl_cmd_push_handlers(MpAV **handlers, char *name, ap_pool_t *p);
char **modperl_srv_config_argv_init(modperl_srv_config_t *scfg, int *argc);
1.3 +4 -1 modperl-2.0/src/modules/perl/modperl_log.c
Index: modperl_log.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_log.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- modperl_log.c 2000/04/15 01:43:18 1.2
+++ modperl_log.c 2000/04/18 22:59:15 1.3
@@ -22,7 +22,8 @@
return;
}
}
-
+ MP_debug_level = 0x0;
+
if (strEQ(level, "all")) {
MP_debug_level = 0xffffffff;
}
@@ -39,4 +40,6 @@
}
MP_debug_level |= 0x80000000;
+
+ MP_TRACE_a_do(MP_TRACE_dump_flags());
}
1.8 +9 -3 modperl-2.0/src/modules/perl/modperl_types.h
Index: modperl_types.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_types.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- modperl_types.h 2000/04/17 21:11:06 1.7
+++ modperl_types.h 2000/04/18 22:59:15 1.8
@@ -102,10 +102,16 @@
} modperl_per_request_config_t;
typedef struct {
- SV *obj;
- CV *cv;
- char *name;
+ SV *obj; /* object or classname if cv is a method */
+ SV *cv; /* subroutine reference or name */
+ char *name; /* orignal name from .conf if any */
+ int cvgen; /* XXX: for caching */
+ AV *args; /* XXX: switch to something lighter */
int flags;
+ PerlInterpreter *perl; /* yuk: for cleanups */
} modperl_handler_t;
+
+#define MP_HANDLER_TYPE_CHAR 1
+#define MP_HANDLER_TYPE_SV 2
#endif /* MODPERL_TYPES_H */