dougm       01/03/09 15:46:38

  Modified:    lib/ModPerl Code.pm
               src/modules/perl mod_perl.c mod_perl.h modperl_callback.c
                        modperl_callback.h modperl_config.c
                        modperl_config.h modperl_filter.c modperl_interp.c
                        modperl_types.h modperl_util.c modperl_util.h
  Log:
  remove use of Perl structures in modperl_handler_t,
  as they are not usable in a threaded environment.
  
  replace with pre-hashed mgv structures for fast lookup
  
  Revision  Changes    Path
  1.42      +3 -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.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- Code.pm   2001/02/22 03:49:22     1.41
  +++ Code.pm   2001/03/09 23:46:33     1.42
  @@ -87,10 +87,10 @@
   #XXX: allow disabling of PerDir hooks on a PerDir basis
   my @hook_flags = (map { canon_uc($_) } keys %hooks);
   my %flags = (
  -    Srv => [qw(NONE CLONE PARENT ENABLED), @hook_flags, 'UNSET'],
  +    Srv => [qw(NONE CLONE PARENT ENABLED AUTOLOAD), @hook_flags, 'UNSET'],
       Dir => [qw(NONE SEND_HEADER SETUP_ENV UNSET)],
       Interp => [qw(NONE IN_USE PUTBACK CLONED BASE)],
  -    Handler => [qw(NONE PARSED METHOD OBJECT ANON)],
  +    Handler => [qw(NONE PARSED METHOD OBJECT ANON AUTOLOAD)],
   );
   
   my %flags_lookup = map { $_,1 } qw(Srv Dir);
  @@ -453,7 +453,7 @@
   );
   
   my @c_src_names = qw(interp tipool log config options callback gtop
  -                     util filter);
  +                     util filter mgv pcw);
   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.29      +22 -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.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- mod_perl.c        2001/02/04 22:19:11     1.28
  +++ mod_perl.c        2001/03/09 23:46:34     1.29
  @@ -115,6 +115,24 @@
       }
   }
   
  +#ifdef USE_ITHREADS
  +static void modperl_init_clones(server_rec *s, apr_pool_t *p)
  +{
  +    for (; s; s=s->next) {
  +        MP_dSCFG(s);
  +        if (scfg->mip->tipool->idle) {
  +            MP_TRACE_i(MP_FUNC, "%s interp already cloned\n",
  +                       s->server_hostname);
  +        }
  +        else {
  +            MP_TRACE_i(MP_FUNC, "cloning interp for %s\n",
  +                       s->server_hostname);
  +            modperl_tipool_init(scfg->mip->tipool);
  +        }
  +    }
  +}
  +#endif
  +
   void modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog, 
                          apr_pool_t *ptemp, server_rec *s)
   {
  @@ -139,6 +157,10 @@
       ap_add_version_component(pconf, MP_VERSION_STRING);
       ap_add_version_component(pconf,
                                Perl_form(aTHX_ "Perl/v%vd", PL_patchlevel));
  +    modperl_mgv_hash_handlers(pconf, s);
  +#ifdef USE_ITHREADS
  +    modperl_init_clones(s, pconf);
  +#endif
   }
   
   void modperl_register_hooks(apr_pool_t *p)
  
  
  
  1.26      +2 -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.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- mod_perl.h        2001/01/21 23:19:03     1.25
  +++ mod_perl.h        2001/03/09 23:46:34     1.26
  @@ -23,6 +23,8 @@
   #include "modperl_options.h"
   #include "modperl_directives.h"
   #include "modperl_filter.h"
  +#include "modperl_pcw.h"
  +#include "modperl_mgv.h"
   
   void modperl_init(server_rec *s, apr_pool_t *p);
   void modperl_hook_init(apr_pool_t *pconf, apr_pool_t *plog, 
  
  
  
  1.21      +55 -251   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.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- modperl_callback.c        2001/03/04 18:41:33     1.20
  +++ modperl_callback.c        2001/03/09 23:46:35     1.21
  @@ -1,41 +1,23 @@
   #include "mod_perl.h"
   
  -static void require_module(pTHX_ const char *pv)
  +modperl_handler_t *modperl_handler_new(apr_pool_t *p, const char *name)
   {
  -    SV* sv;
  -    dSP;
  -    PUSHSTACKi(PERLSI_REQUIRE);
  -    PUTBACK;
  -    sv = sv_newmortal();
  -    sv_setpv(sv, "require ");
  -    sv_catpv(sv, pv);
  -    eval_sv(sv, G_DISCARD);
  -    SPAGAIN;
  -    POPSTACK;
  -}
  -
  -modperl_handler_t *modperl_handler_new(apr_pool_t *p, void *h, int type)
  -{
       modperl_handler_t *handler = 
           (modperl_handler_t *)apr_pcalloc(p, sizeof(*handler));
  -
  -    switch (type) {
  -      case MP_HANDLER_TYPE_SV:
  -        handler->cv = SvREFCNT_inc((SV*)h);
  -        MpHandlerPARSED_On(handler);
  -        break;
  -      case MP_HANDLER_TYPE_CHAR:
  -        handler->name = (char *)h;
  -        MP_TRACE_h(MP_FUNC, "new handler %s\n", handler->name);
  -        break;
  -    };
   
  -    apr_pool_cleanup_register(p, (void*)handler,
  -                         modperl_handler_cleanup, apr_pool_cleanup_null);
  +    handler->name = name;
  +    MP_TRACE_h(MP_FUNC, "new handler %s\n", handler->name);
   
       return handler;
   }
   
  +modperl_handler_t *modperl_handler_dup(apr_pool_t *p,
  +                                       modperl_handler_t *h)
  +{
  +    MP_TRACE_h(MP_FUNC, "dup handler %s\n", h->name);
  +    return modperl_handler_new(p, h->name);
  +}
  +
   void modperl_handler_make_args(pTHX_ AV *av, ...)
   {
       va_list args;
  @@ -59,221 +41,31 @@
   
       va_end(args);
   }
  -
  -apr_status_t modperl_handler_cleanup(void *data)
  -{
  -    modperl_handler_t *handler = (modperl_handler_t *)data;
  -    modperl_handler_unparse(handler);
  -    return APR_SUCCESS;
  -}
  -
  -void modperl_handler_cache_cv(pTHX_ modperl_handler_t *handler, CV *cv)
  -{
  -    if (1) {
  -        /* XXX: figure out how to invalidate cache
  -         * e.g. if subroutine is redefined
  -         */
  -        handler->cv = SvREFCNT_inc((SV*)cv);
  -        /* handler->cvgen = MP_sub_generation; */;
  -    }
  -    else {
  -        handler->cv = Perl_newSVpvf(aTHX_ "%s::%s",
  -                                    HvNAME(GvSTASH(CvGV(cv))),
  -                                    GvNAME(CvGV(cv)));
  -    }
  -    MP_TRACE_h(MP_FUNC, "caching %s::%s\n",
  -               HvNAME(GvSTASH(CvGV(cv))),
  -               GvNAME(CvGV(cv)));
  -}
  -
  -int modperl_handler_lookup(pTHX_ modperl_handler_t *handler,
  -                           char *package, char *name)
  -{
  -    CV *cv;
  -    GV *gv;
  -    HV *stash = gv_stashpv(package, FALSE);
  -
  -    if (!stash) {
  -        MP_TRACE_h(MP_FUNC, "package %s not defined, attempting to load\n",
  -                   package);
  -        require_module(aTHX_ package);
  -        if (SvTRUE(ERRSV)) {
  -            MP_TRACE_h(MP_FUNC, "failed to load %s package\n", package);
  -            return 0;
  -        }
  -        else {
  -            MP_TRACE_h(MP_FUNC, "loaded %s package\n", package);
  -            if (!(stash = gv_stashpv(package, FALSE))) {
  -                MP_TRACE_h(MP_FUNC, "%s package still does not exist\n",
  -                           package);
  -                return 0;
  -            }
  -        }
  -    }
  -
  -    if ((gv = gv_fetchmethod(stash, name)) && (cv = GvCV(gv))) {
  -        if (CvFLAGS(cv) & CVf_METHOD) { /* sub foo : method {}; */
  -            MpHandlerMETHOD_On(handler);
  -            handler->obj = newSVpv(package, 0);
  -            handler->cv = newSVpv(name, 0);
  -        }
  -        else {
  -            modperl_handler_cache_cv(aTHX_ handler, cv);
  -        }
  -
  -        MpHandlerPARSED_On(handler);
  -        MP_TRACE_h(MP_FUNC, "found `%s' in class `%s' as a %s\n",
  -                   name, HvNAME(stash),
  -                   MpHandlerMETHOD(handler) ? "method" : "function");
  -
  -        return 1;
  -    }
  -    
  -    MP_TRACE_h(MP_FUNC, "`%s' not found in class `%s'\n",
  -               name, HvNAME(stash));
  -
  -    return 0;
  -}
  -
  -void modperl_handler_unparse(modperl_handler_t *handler)
  -{
  -    dTHXa(handler->perl);
  -    int was_parsed = handler->args || handler->cv || handler->obj;
  -
  -    if (!MpHandlerPARSED(handler)) {
  -        if (was_parsed) {
  -            MP_TRACE_h(MP_FUNC, "handler %s was parsed, but not flagged\n",
  -                       handler->name);
  -        }
  -        else {
  -            MP_TRACE_h(MP_FUNC, "handler %s was never parsed\n", handler->name);
  -            return;
  -        }
  -    }
  -
  -    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;
  -    }
  -    if (handler->obj) {
  -        SvREFCNT_dec(handler->obj);
  -        handler->obj = Nullsv;
  -    }
  -
  -    MP_TRACE_h(MP_FUNC, "%s unparsed\n", handler->name);
  -}
   
  -int modperl_handler_parse(pTHX_ modperl_handler_t *handler)
  +int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p,
  +                     AV *args)
   {
  -    char *name = handler->name;
  -    char *tmp;
  -    CV *cv;
  -
  -#ifdef USE_ITHREADS
  -    handler->perl = aTHX;
  -#endif
  -
  -    if (strnEQ(name, "sub ", 4)) {
  -        handler->cv = eval_pv(name, FALSE);
  -        MP_TRACE_h(MP_FUNC, "handler is anonymous\n");
  -        if (!SvTRUE(handler->cv) || SvTRUE(ERRSV)) {
  -            MP_TRACE_h(MP_FUNC, "eval failed: %s\n", SvPVX(ERRSV));
  -            handler->cv = Nullsv;
  -            return 0;
  -        }
  -        SvREFCNT_inc(handler->cv);
  -        MpHandlerANON_On(handler);
  -        MpHandlerPARSED_On(handler);
  -        return 1;
  -    }
  -    
  -    if ((tmp = strstr(name, "->"))) {
  -        char package[256]; /*XXX*/
  -        int package_len = strlen(name) - strlen(tmp);
  -        apr_cpystrn(package, name, package_len+1);
  -
  -        MpHandlerMETHOD_On(handler);
  -        handler->cv = newSVpv(&tmp[2], 0);
  -
  -        if (*package == '$') {
  -            SV *obj = eval_pv(package, FALSE);
  -
  -            if (SvTRUE(obj)) {
  -                handler->obj = SvREFCNT_inc(obj);
  -                if (SvROK(obj) && sv_isobject(obj)) {
  -                    MpHandlerOBJECT_On(handler);
  -                    MP_TRACE_h(MP_FUNC, "handler object %s isa %s\n",
  -                               package, HvNAME(SvSTASH((SV*)SvRV(obj))));
  -                }
  -                else {
  -                    MP_TRACE_h(MP_FUNC, "%s is not an object, pv=%s\n",
  -                               package, SvPV_nolen(obj));
  -                }
  -            }
  -            else {
  -                MP_TRACE_h(MP_FUNC, "failed to thaw %s\n", package);
  -                return 0;
  -            }
  -        }
  -
  -        if (!handler->obj) {
  -            handler->obj = newSVpv(package, package_len);
  -            MP_TRACE_h(MP_FUNC, "handler method %s isa %s\n",
  -                       SvPVX(handler->cv), package);
  -        }
  -
  -        MpHandlerPARSED_On(handler);
  -        return 1;
  -    }
  -
  -    if ((cv = get_cv(name, FALSE))) {
  -        modperl_handler_cache_cv(aTHX_ handler, cv);
  -        MpHandlerPARSED_On(handler);
  -        return 1;
  -    }
  -
  -    if (modperl_handler_lookup(aTHX_ handler, name, "handler")) {
  -        return 1;
  -    }
  -
  -    return 0;
  -}
  -
  -int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p)
  -{
  +    CV *cv=Nullcv;
  +    I32 flags = G_EVAL|G_SCALAR;
       dSP;
       int count, status;
   
   #ifdef USE_ITHREADS
  -    if (p) {
  -        /* under ithreads, each handler needs to get_cv() from the
  -         * selected interpreter so the proper CvPADLIST is used
  -         * XXX: this should probably be reworked so threads can cache
  -         * parsed handlers
  +    if (p && !MpHandlerPARSED(handler)) {
  +        /*
  +         * cannot update the handler structure at request time without
  +         * locking, so just copy it
            */
  -        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;
  +        handler = modperl_handler_dup(p, handler);
       }
   #endif
   
  +    MP_TRACE_h_do(MpHandler_dump_flags(handler, handler->name));
  +
       if (!MpHandlerPARSED(handler)) {
  -        if (!modperl_handler_parse(aTHX_ handler)) {
  -            MP_TRACE_h(MP_FUNC, "failed to parse handler `%s'\n",
  +        MpHandlerAUTOLOAD_On(handler);
  +        if (!modperl_mgv_resolve(aTHX_ handler, p, handler->name)) {
  +            MP_TRACE_h(MP_FUNC, "failed to resolve handler `%s'\n",
                          handler->name);
               return HTTP_INTERNAL_SERVER_ERROR;
           }
  @@ -283,26 +75,41 @@
       PUSHMARK(SP);
   
       if (MpHandlerMETHOD(handler)) {
  -        XPUSHs(handler->obj);
  +        GV *gv = modperl_mgv_lookup(aTHX_ handler->mgv_obj);
  +        XPUSHs(modperl_mgv_sv(gv));
       }
   
  -    if (handler->args) {
  -        I32 items = AvFILLp(handler->args) + 1;
  +    if (args) {
  +        I32 items = AvFILLp(args) + 1;
   
           EXTEND(SP, items);
  -        Copy(AvARRAY(handler->args), SP + 1, items, SV*);
  +        Copy(AvARRAY(args), SP + 1, items, SV*);
           SP += items;
       }
   
       PUTBACK;
   
  -    if (MpHandlerMETHOD(handler)) {
  -        count = call_method(SvPVX(handler->cv), G_EVAL|G_SCALAR);
  +    if (MpHandlerANON(handler)) {
  +        SV *sv = eval_pv(handler->name, TRUE); /* XXX: cache */
  +        cv = (CV*)SvRV(sv);
       }
       else {
  -        count = call_sv(handler->cv, G_EVAL|G_SCALAR);
  +        GV *gv = modperl_mgv_lookup(aTHX_ handler->mgv_cv);
  +        if (gv) {
  +            cv = modperl_mgv_cv(gv);
  +        }
  +        else {
  +            char *name = modperl_mgv_as_string(aTHX_ handler->mgv_cv, p);
  +            MP_TRACE_h(MP_FUNC, "lookup of %s failed\n", name);
  +        }
       }
   
  +    if (MpHandlerMETHOD(handler)) {
  +        flags |= G_METHOD;
  +    }
  +
  +    count = call_sv((SV*)cv, flags);
  +
       SPAGAIN;
   
       if (count != 1) {
  @@ -316,7 +123,7 @@
       FREETMPS;LEAVE;
   
       if (SvTRUE(ERRSV)) {
  -        MP_TRACE_h(MP_FUNC, "$@ = %s\n", SvPVX(ERRSV));
  +        MP_TRACE_h(MP_FUNC, "$@ = %s", SvPVX(ERRSV));
           status = HTTP_INTERNAL_SERVER_ERROR;
       }
   
  @@ -422,30 +229,27 @@
             break;
         case MP_HANDLER_TYPE_PROC:
             {
  -              apr_pool_t *p;
  +              apr_pool_t *pconf;
   
                 va_start(args, type);
  -              p = va_arg(args, apr_pool_t *);
  +              pconf = va_arg(args, apr_pool_t *);
                 va_end(args);
   
  +              if (!p) {
  +                  p = pconf;
  +              }
  +
                 modperl_handler_make_args(aTHX_ av_args,
  -                                        "Apache::Pool", p,
  +                                        "Apache::Pool", pconf,
                                           "Apache::Server", s, NULL);
             }
             break;
       };
   
       for (i=0; i<av->nelts; i++) {
  -#ifdef USE_ITHREADS
  -        if (!handlers[i]->perl) {
  -            handlers[i]->perl = aTHX;
  -        }
  -#endif
  -        handlers[i]->args = av_args;
  -        if ((status = modperl_callback(aTHX_ handlers[i], p)) != OK) {
  +        if ((status = modperl_callback(aTHX_ handlers[i], p, av_args)) != OK) {
               status = modperl_errsv(aTHX_ status, r, s);
           }
  -        handlers[i]->args = Nullav;
   
           MP_TRACE_h(MP_FUNC, "%s returned %d\n",
                      handlers[i]->name, status);
  
  
  
  1.11      +6 -13     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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- modperl_callback.h        2001/02/18 21:55:08     1.10
  +++ modperl_callback.h        2001/03/09 23:46:35     1.11
  @@ -16,22 +16,15 @@
   #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);
  +modperl_handler_t *modperl_handler_new(apr_pool_t *p, const char *name);
   
  -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);
  +modperl_handler_t *modperl_handler_dup(apr_pool_t *p,
  +                                       modperl_handler_t *h);
   
  -int modperl_handler_lookup(pTHX_ modperl_handler_t *handler,
  -                           char *package, char *name);
  -
  -void modperl_handler_unparse(modperl_handler_t *handler);
  -
  -int modperl_handler_parse(pTHX_ modperl_handler_t *handler);
  +void modperl_handler_make_args(pTHX_ AV *avp, ...);
   
  -int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p);
  +int modperl_callback(pTHX_ modperl_handler_t *handler, apr_pool_t *p,
  +                     AV *args);
   
   int modperl_run_handlers(int idx, request_rec *r, conn_rec *c,
                            server_rec *s, int type, ...);
  
  
  
  1.18      +2 -2      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.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- modperl_config.c  2001/02/08 19:42:05     1.17
  +++ modperl_config.c  2001/03/09 23:46:35     1.18
  @@ -3,8 +3,8 @@
   char *modperl_cmd_push_handlers(MpAV **handlers, const char *name,
                                   apr_pool_t *p)
   {
  -    modperl_handler_t *h = modperl_handler_new(p, (void*)name,
  -                                               MP_HANDLER_TYPE_CHAR);
  +    modperl_handler_t *h = modperl_handler_new(p, name);
  +
       if (!*handlers) {
           *handlers = apr_array_make(p, 1, sizeof(modperl_handler_t *));
           MP_TRACE_d(MP_FUNC, "created handler stack\n");
  
  
  
  1.17      +6 -0      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.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- modperl_config.h  2001/01/21 21:04:52     1.16
  +++ modperl_config.h  2001/03/09 23:46:35     1.17
  @@ -70,4 +70,10 @@
   #define MP_dSCFG(s) \
      modperl_srv_config_t *scfg = modperl_srv_config_get(s)
   
  +#ifdef USE_ITHREADS
  +#   define MP_dSCFG_dTHX dTHXa(scfg->mip->parent->perl)
  +#else
  +#   define MP_dSCFG_dTHX dTHXa(scfg->perl)
  +#endif
  +
   #endif /* MODPERL_CONFIG_H */
  
  
  
  1.5       +6 -7      modperl-2.0/src/modules/perl/modperl_filter.c
  
  Index: modperl_filter.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- modperl_filter.c  2001/02/08 19:42:08     1.4
  +++ modperl_filter.c  2001/03/09 23:46:35     1.5
  @@ -81,6 +81,7 @@
   
   int modperl_run_filter(modperl_filter_t *filter)
   {
  +    AV *args;
       int status;
       modperl_handler_t *handler =
           ((modperl_filter_ctx_t *)filter->f->ctx)->handler;
  @@ -94,25 +95,23 @@
       pTHX;
       modperl_interp_t *interp = NULL;
       interp = modperl_interp_select(r, c, s);
  -    handler->perl = aTHX = interp->perl;
  +    aTHX = interp->perl;
       PERL_SET_CONTEXT(aTHX);
   #endif
   
  -    handler->args = newAV();
  +    args = newAV();
   
  -    modperl_handler_make_args(aTHX_ handler->args,
  +    modperl_handler_make_args(aTHX_ args,
                                 filter_classes[filter->mode], filter,
                                 NULL);
   
  -    if ((status = modperl_callback(aTHX_ handler, p)) != OK) {
  +    if ((status = modperl_callback(aTHX_ handler, p, args)) != OK) {
           status = modperl_errsv(aTHX_ status, r, s);
       }
   
  -    SvREFCNT_dec((SV*)handler->args);
  -    handler->args = Nullav;
  +    SvREFCNT_dec((SV*)args);
   
       MP_TRACE_f(MP_FUNC, "%s returned %d\n", handler->name, status);
  -
   
       return status;
   }
  
  
  
  1.18      +2 -1      modperl-2.0/src/modules/perl/modperl_interp.c
  
  Index: modperl_interp.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_interp.c,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- modperl_interp.c  2001/02/08 19:42:13     1.17
  +++ modperl_interp.c  2001/03/09 23:46:35     1.18
  @@ -173,7 +173,8 @@
       mip->parent = modperl_interp_new(p, mip, NULL);
       aTHX = mip->parent->perl = perl;
       
  -    modperl_tipool_init(tipool);
  +    /* this happens post-config in mod_perl.c:modperl_init_clones() */
  +    /* modperl_tipool_init(tipool); */
   
       apr_pool_cleanup_register(p, (void*)mip,
                                 modperl_interp_pool_destroy,
  
  
  
  1.22      +15 -9     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.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- modperl_types.h   2001/02/28 05:46:53     1.21
  +++ modperl_types.h   2001/03/09 23:46:36     1.22
  @@ -37,7 +37,7 @@
       modperl_interp_pool_t *mip;
       PerlInterpreter *perl;
       int num_requests;
  -    int flags;
  +    U8 flags;
   #ifdef MP_TRACE
       unsigned long tid;
   #endif
  @@ -136,17 +136,23 @@
       MpAV *handlers[MP_PER_DIR_NUM_HANDLERS];
       MpHV *SetEnv;
       MpHV *SetVars;
  -    int flags;
  +    U8 flags;
   } modperl_dir_config_t;
   
  +typedef struct modperl_mgv_t modperl_mgv_t;
  +
  +struct modperl_mgv_t {
  +    char *name;
  +    int len;
  +    UV hash;
  +    modperl_mgv_t *next;
  +};
  +
   typedef struct {
  -    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;
  +    modperl_mgv_t *mgv_obj;
  +    modperl_mgv_t *mgv_cv;
  +    const char *name; /* orignal name from .conf if any */
  +    U8 flags;
   } modperl_handler_t;
   
   #define MP_HANDLER_TYPE_CHAR 1
  
  
  
  1.3       +17 -0     modperl-2.0/src/modules/perl/modperl_util.c
  
  Index: modperl_util.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- modperl_util.c    2001/01/02 06:40:20     1.2
  +++ modperl_util.c    2001/03/09 23:46:36     1.3
  @@ -1,5 +1,22 @@
   #include "mod_perl.h"
   
  +int modperl_require_module(pTHX_ const char *pv)
  +{
  +    SV *sv;
  +
  +    dSP;
  +    PUSHSTACKi(PERLSI_REQUIRE);
  +    PUTBACK;
  +    sv = sv_newmortal();
  +    sv_setpv(sv, "require ");
  +    sv_catpv(sv, pv);
  +    eval_sv(sv, G_DISCARD);
  +    SPAGAIN;
  +    POPSTACK;
  +
  +    return SvTRUE(ERRSV) ? FALSE : TRUE;
  +}
  +
   MP_INLINE request_rec *modperl_sv2request_rec(pTHX_ SV *sv)
   {
       request_rec *r = NULL;
  
  
  
  1.4       +2 -0      modperl-2.0/src/modules/perl/modperl_util.h
  
  Index: modperl_util.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_util.h,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- modperl_util.h    2001/02/28 05:25:00     1.3
  +++ modperl_util.h    2001/03/09 23:46:36     1.4
  @@ -18,4 +18,6 @@
   
   int modperl_errsv(pTHX_ int status, request_rec *r, server_rec *s);
   
  +int modperl_require_module(pTHX_ const char *pv);
  +
   #endif /* MODPERL_UTIL_H */
  
  
  

Reply via email to