dougm       2002/08/28 21:32:50

  Modified:    src/modules/perl modperl_module.c
  Log:
  lookup {DIR,SERVER}_CREATE methods once per module
  
  Revision  Changes    Path
  1.5       +22 -18    modperl-2.0/src/modules/perl/modperl_module.c
  
  Index: modperl_module.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_module.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- modperl_module.c  29 Aug 2002 04:16:27 -0000      1.4
  +++ modperl_module.c  29 Aug 2002 04:32:50 -0000      1.5
  @@ -5,12 +5,11 @@
       modperl_mgv_t *dir_merge;
       modperl_mgv_t *srv_create;
       modperl_mgv_t *srv_merge;
  +    int namelen;
   } modperl_module_info_t;
   
   typedef struct {
       server_rec *server;
  -    const char *name;
  -    int namelen;
       modperl_module_info_t *minfo;
   } modperl_module_cfg_t;
   
  @@ -233,11 +232,12 @@
                                 PTR_TBL_t *table,
                                 modperl_module_cfg_t *cfg,
                                 modperl_module_cmd_data_t *info,
  -                              const char *method,
  +                              modperl_mgv_t *method,
                                 cmd_parms *parms,
                                 SV **obj)
   {
  -    HV *stash;
  +    const char *mname = info->modp->name;
  +    modperl_module_info_t *minfo = MP_MODULE_INFO(info->modp);
       GV *gv;
       int is_startup = (p == parms->server->process->pconf);
   
  @@ -253,26 +253,19 @@
   
       MP_TRACE_c(MP_FUNC, "%s cfg=0x%lx for %s.%s\n",
                  method, (unsigned long)cfg,
  -               info->modp->name,
  -               parms->cmd->name);
  +               mname, parms->cmd->name);
   
  -    cfg->name = info->modp->name;
  -    cfg->namelen = strlen(cfg->name);
       /* used by merge functions to get a Perl interp */
       cfg->server = parms->server;
  -    cfg->minfo = MP_MODULE_INFO(info->modp);
  +    cfg->minfo = minfo;
   
  -    stash = gv_stashpvn(cfg->name, cfg->namelen, TRUE);
  -
  -    /* return $class->type if $class->can(type) */
  -    /* XXX: should do this lookup at startup time */
  -    if ((gv = gv_fetchmethod_autoload(stash, method, FALSE)) && isGV(gv)) {
  +    if (method && (gv = modperl_mgv_lookup(aTHX_ method))) {
           int count;
           dSP;
   
           ENTER;SAVETMPS;
           PUSHMARK(sp);
  -        XPUSHs(sv_2mortal(newSVpv(cfg->name, cfg->namelen)));
  +        XPUSHs(sv_2mortal(newSVpv(mname, minfo->namelen)));
           XPUSHs(modperl_bless_cmd_parms(parms));
   
           PUTBACK;
  @@ -291,6 +284,7 @@
           }
       }
       else {
  +        HV *stash = gv_stashpvn(mname, minfo->namelen, FALSE);
           /* return bless {}, $class */
           *obj = newRV_noinc((SV*)newHV());
           *obj = sv_bless(*obj, stash);
  @@ -321,6 +315,7 @@
       apr_pool_t *p = parms->pool;
       modperl_module_cmd_data_t *info =
           (modperl_module_cmd_data_t *)cmd->cmd_data;
  +    modperl_module_info_t *minfo = MP_MODULE_INFO(info->modp);
       modperl_module_cfg_t *srv_cfg;
   
   #ifdef USE_ITHREADS
  @@ -334,7 +329,8 @@
       dSP;
   
       errmsg = modperl_module_config_get_obj(aTHX_ p, table, cfg, info,
  -                                           "DIR_CREATE", parms, &obj);
  +                                           minfo->dir_create,
  +                                           parms, &obj);
   
       if (errmsg) {
           return errmsg;
  @@ -354,8 +350,8 @@
       if (srv_cfg) {
           SV *srv_obj;
           errmsg = modperl_module_config_get_obj(aTHX_ p, table, srv_cfg, info,
  -                                               "SERVER_CREATE", parms,
  -                                               &srv_obj);
  +                                               minfo->srv_create,
  +                                               parms, &srv_obj);
           if (errmsg) {
               return errmsg;
           }
  @@ -729,8 +725,16 @@
       modp->create_server_config = modperl_module_config_srv_create;
       modp->merge_server_config  = modperl_module_config_srv_merge;
   
  +    minfo->namelen = strlen(name);
  +
  +    minfo->dir_create =
  +        modperl_module_fetch_method(aTHX_ p, modp, "DIR_CREATE");
  +
       minfo->dir_merge =
           modperl_module_fetch_method(aTHX_ p, modp, "DIR_MERGE");
  +
  +    minfo->srv_create =
  +        modperl_module_fetch_method(aTHX_ p, modp, "SERVER_CREATE");
   
       minfo->srv_merge =
           modperl_module_fetch_method(aTHX_ p, modp, "SERVER_MERGE");
  
  
  


Reply via email to