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 */
  
  
  

Reply via email to