dougm       00/04/20 22:25:32

  Modified:    src/modules/perl mod_perl.c mod_perl.h modperl_callback.c
                        modperl_config.c modperl_config.h modperl_interp.c
                        modperl_interp.h modperl_types.h
  Log:
  integrate with generated register_hooks and command_rec entries
  stash selected interpreter in r->per_request_config
  Perl*Handlers are now hooked up and run!
  some indenting fixups
  
  Revision  Changes    Path
  1.10      +4 -3      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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- mod_perl.c        2000/04/18 22:59:14     1.9
  +++ mod_perl.c        2000/04/21 05:25:30     1.10
  @@ -15,6 +15,8 @@
       );
   #endif
   
  +    argv = modperl_srv_config_argv_init(scfg, &argc);
  +
       if (!(perl = perl_alloc())) {
           perror("perl_alloc");
           exit(1);
  @@ -22,8 +24,6 @@
   
       perl_construct(perl);
   
  -    argv = modperl_srv_config_argv_init(scfg, &argc);
  -
       status = perl_parse(perl, xs_init, argc, argv, NULL);
   
       if (status) {
  @@ -62,6 +62,7 @@
   {
       /* XXX: should be pre_config hook or 1.xx logic */
       ap_hook_open_logs(modperl_hook_init, NULL, NULL, HOOK_MIDDLE);
  +    modperl_register_handler_hooks();
   }
   
   static command_rec modperl_cmds[] = {  
  @@ -79,7 +80,7 @@
       MP_SRV_CMD_TAKE1("PerlInterpMinSpare", interp_min_spare,
                        "Min number of spare Perl interpreters"),
   #endif
  -    MP_CMD_POST_READ_REQUEST_ENTRY,
  +    MP_CMD_ENTRIES,
       { NULL }, 
   }; 
   
  
  
  
  1.10      +1 -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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- mod_perl.h        2000/04/17 21:29:41     1.9
  +++ mod_perl.h        2000/04/21 05:25:30     1.10
  @@ -19,6 +19,7 @@
   #include "http_log.h"
   #include "http_protocol.h"
   #include "http_main.h"
  +#include "http_request.h"
   
   #include "apr_lock.h"
   
  
  
  
  1.2       +101 -16   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.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- modperl_callback.c        2000/04/18 22:58:10     1.1
  +++ modperl_callback.c        2000/04/21 05:25:31     1.2
  @@ -59,8 +59,8 @@
                                  GvNAME(CvGV(cv)));
       }
       MP_TRACE_h(MP_FUNC, "caching %s::%s\n",
  -            HvNAME(GvSTASH(CvGV(cv))),
  -            GvNAME(CvGV(cv)));
  +               HvNAME(GvSTASH(CvGV(cv))),
  +               GvNAME(CvGV(cv)));
   }
   
   int modperl_handler_lookup(pTHX_ modperl_handler_t *handler,
  @@ -72,7 +72,7 @@
   
       if (!stash) {
           MP_TRACE_h(MP_FUNC, "class %s not defined, attempting to load\n",
  -                class);
  +                   class);
           require_module(aTHX_ class);
           if (SvTRUE(ERRSV)) {
               MP_TRACE_h(MP_FUNC, "failed to load %s class\n", class);
  @@ -82,7 +82,7 @@
               MP_TRACE_h(MP_FUNC, "loaded %s class\n", class);
               if (!(stash = gv_stashpv(class, FALSE))) {
                   MP_TRACE_h(MP_FUNC, "%s package still does not exist\n",
  -                        class);
  +                           class);
                   return 0;
               }
           }
  @@ -100,14 +100,14 @@
   
           MpHandlerPARSED_On(handler);
           MP_TRACE_h(MP_FUNC, "found `%s' in class `%s' as a %s\n",
  -                name, HvNAME(stash),
  -                MpHandlerMETHOD(handler) ? "method" : "function");
  +                   name, HvNAME(stash),
  +                   MpHandlerMETHOD(handler) ? "method" : "function");
   
           return 1;
       }
       
       MP_TRACE_h(MP_FUNC, "`%s' not found in class `%s'\n",
  -            name, HvNAME(stash));
  +               name, HvNAME(stash));
   
       return 0;
   }
  @@ -119,7 +119,7 @@
       if (!MpHandlerPARSED(handler)) {
           if (was_parsed) {
               MP_TRACE_h(MP_FUNC, "handler %s was parsed, but not flagged\n",
  -                    handler->name);
  +                       handler->name);
           }
           else {
               MP_TRACE_h(MP_FUNC, "handler %s was never parsed\n", handler->name);
  @@ -170,8 +170,7 @@
       if ((tmp = strstr(name, "->"))) {
           char class[256]; /*XXX*/
           int class_len = strlen(name) - strlen(tmp);
  -        strncpy(class, name, class_len+1);
  -        class[class_len] = '\0';
  +        ap_cpystrn(class, name, class_len+1);
   
           MpHandlerMETHOD_On(handler);
           handler->cv = newSVpv(&tmp[2], 0);
  @@ -184,11 +183,11 @@
                   if (SvROK(obj) && sv_isobject(obj)) {
                       MpHandlerOBJECT_On(handler);
                       MP_TRACE_h(MP_FUNC, "handler object %s isa %s\n",
  -                            class, HvNAME(SvSTASH((SV*)SvRV(obj))));
  +                               class, HvNAME(SvSTASH((SV*)SvRV(obj))));
                   }
                   else {
                       MP_TRACE_h(MP_FUNC, "%s is not an object, pv=%s\n",
  -                            class, SvPV_nolen(obj));
  +                               class, SvPV_nolen(obj));
                   }
               }
               else {
  @@ -200,7 +199,7 @@
           if (!handler->obj) {
               handler->obj = newSVpv(class, class_len);
               MP_TRACE_h(MP_FUNC, "handler method %s isa %s\n",
  -                    SvPVX(handler->cv), class);
  +                       SvPVX(handler->cv), class);
           }
   
           MpHandlerPARSED_On(handler);
  @@ -228,13 +227,13 @@
       if (!MpHandlerPARSED(handler)) {
           if (!modperl_handler_parse(aTHX_ handler)) {
               MP_TRACE_h(MP_FUNC, "failed to parse handler `%s'\n",
  -                    handler->name);
  +                       handler->name);
               return HTTP_INTERNAL_SERVER_ERROR;
           }
       }
   
       ENTER;SAVETMPS;
  -    PUSHMARK(sp);
  +    PUSHMARK(SP);
   
       if (MpHandlerMETHOD(handler)) {
           XPUSHs(handler->obj);
  @@ -242,7 +241,8 @@
   
       if (handler->args) {
           I32 i, len = AvFILL(handler->args);
  -        EXTEND(sp, len);
  +
  +        EXTEND(SP, len);
           for (i=0; i<=len; i++) {
               PUSHs(sv_2mortal(*av_fetch(handler->args, i, FALSE)));
           }
  @@ -275,4 +275,89 @@
       }
   
       return status;
  +}
  +
  +#define MP_HANDLER_TYPE_DIR 1
  +#define MP_HANDLER_TYPE_SRV 2
  +
  +int modperl_run_handlers(int idx, request_rec *r, server_rec *s, int type)
  +{
  +    pTHX;
  +    MP_dSCFG(s);
  +    modperl_handler_t **handlers;
  +    MpAV *av;
  +    int i, status;
  +#ifdef MP_TRACE
  +    const char *desc;
  +#endif
  +
  +    if (type == MP_HANDLER_TYPE_DIR) {
  +        MP_dDCFG;
  +        av = dcfg->handlers[idx];
  +        MP_TRACE_a_do(desc = modperl_per_dir_handler_desc(idx));
  +    }
  +    else {
  +        av = scfg->handlers[idx];
  +        MP_TRACE_a_do(desc = modperl_per_srv_handler_desc(idx));
  +    }
  +
  +    if (!av) {
  +        MP_TRACE_h(MP_FUNC, "no %s handlers configured (%s)\n",
  +                   desc, r ? r->uri : "");
  +        return DECLINED;
  +    }
  +
  +    if (r) {
  +        MP_dRCFG;
  +        if (!rcfg) {
  +            rcfg = modperl_request_config_new(r);
  +            ap_set_module_config(r->request_config, &perl_module, rcfg);
  +        }
  +#ifdef USE_ITHREADS
  +        aTHX = rcfg->interp->perl;
  +#endif
  +    }
  +#ifdef USE_ITHREADS
  +    else if (s) {
  +        /* Child{Init,Exit} */
  +        aTHX = scfg->mip->parent->perl;
  +    }
  +#endif
  +
  +    MP_TRACE_h(MP_FUNC, "running %d %s handlers\n",
  +               av->nelts, desc);
  +    handlers = (modperl_handler_t **)av->elts;
  +
  +    for (i=0; i<av->nelts; i++) {
  +        status = modperl_callback(aTHX_ handlers[i]);
  +        MP_TRACE_h(MP_FUNC, "%s returned %d\n",
  +                   handlers[i]->name, status);
  +    }
  +
  +    return status;
  +}
  +
  +int modperl_per_dir_callback(int idx, request_rec *r)
  +{
  +    return modperl_run_handlers(idx, r, r->server, MP_HANDLER_TYPE_DIR);
  +}
  +
  +int modperl_per_srv_callback(int idx, request_rec *r)
  +{
  +    return modperl_run_handlers(idx, r, r->server, MP_HANDLER_TYPE_SRV);
  +}
  +
  +int modperl_connection_callback(int idx, conn_rec *c)
  +{
  +    return DECLINED;
  +}
  +
  +void modperl_process_callback(int idx, ap_pool_t *p, server_rec *s)
  +{
  +}
  +
  +void modperl_files_callback(int idx,
  +                            ap_pool_t *pconf, ap_pool_t *plog,
  +                            ap_pool_t *ptemp, server_rec *s)
  +{
   }
  
  
  
  1.8       +46 -7     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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- modperl_config.c  2000/04/18 22:59:15     1.7
  +++ modperl_config.c  2000/04/21 05:25:31     1.8
  @@ -19,14 +19,40 @@
   
   void *modperl_create_dir_config(ap_pool_t *p, char *dir)
   {
  -    return NULL;
  +    modperl_dir_config_t *dcfg = modperl_dir_config_new(p);
  +    return dcfg;
   }
   
  -void *modperl_merge_dir_config(ap_pool_t *p, void *base, void *add)
  +void *modperl_merge_dir_config(ap_pool_t *p, void *basev, void *addv)
   {
  -    return NULL;
  +#if 0
  +    modperl_dir_config_t
  +        *base = (modperl_dir_config_t *)basev,
  +        *add  = (modperl_dir_config_t *)addv,
  +        *mrg  = modperl_dir_config_new(p);
  +#endif
  +
  +    MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx\n", 
  +               (unsigned long)basev, (unsigned long)addv);
  +
  +    return addv;
   }
   
  +modperl_request_config_t *modperl_request_config_new(request_rec *r)
  +{
  +    modperl_request_config_t *rcfg = 
  +        (modperl_request_config_t *)ap_pcalloc(r->pool, sizeof(*rcfg));
  +
  +#ifdef USE_ITHREADS
  +    rcfg->interp = modperl_interp_select(r);
  +    PERL_SET_INTERP(rcfg->interp->perl);
  +#endif
  +
  +    MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)rcfg);
  +
  +    return rcfg;
  +}
  +
   #define scfg_push_argv(arg) \
       *(char **)ap_push_array(scfg->argv) = arg
   
  @@ -39,9 +65,21 @@
   
       scfg_push_argv((char *)ap_server_argv0);
   
  +    MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)scfg);
  +
       return scfg;
   }
   
  +modperl_dir_config_t *modperl_dir_config_new(ap_pool_t *p)
  +{
  +    modperl_dir_config_t *dcfg = (modperl_dir_config_t *)
  +        ap_pcalloc(p, sizeof(modperl_dir_config_t));
  +
  +    MP_TRACE_d(MP_FUNC, "0x%lx\n", (unsigned long)dcfg);
  +
  +    return dcfg;
  +}
  +
   #ifdef MP_TRACE
   static void dump_argv(modperl_srv_config_t *scfg)
   {
  @@ -95,11 +133,12 @@
           *base = (modperl_srv_config_t *)basev,
           *add  = (modperl_srv_config_t *)addv,
           *mrg  = modperl_srv_config_new(p);
  -
  -    return mrg;
  -#else
  -    return basev;
   #endif
  +
  +    MP_TRACE_d(MP_FUNC, "basev==0x%lx, addv==0x%lx\n", 
  +               (unsigned long)basev, (unsigned long)addv);
  +
  +    return addv;
   }
   
   #define MP_CONFIG_BOOTSTRAP(parms) \
  
  
  
  1.8       +5 -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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- modperl_config.h  2000/04/18 22:59:15     1.7
  +++ modperl_config.h  2000/04/21 05:25:31     1.8
  @@ -3,9 +3,13 @@
   
   void *modperl_create_dir_config(ap_pool_t *p, char *dir);
   
  -void *modperl_merge_dir_config(ap_pool_t *p, void *base, void *add);
  +void *modperl_merge_dir_config(ap_pool_t *p, void *basev, void *addv);
   
   modperl_srv_config_t *modperl_srv_config_new(ap_pool_t *p);
  +
  +modperl_dir_config_t *modperl_dir_config_new(ap_pool_t *p);
  +
  +modperl_request_config_t *modperl_request_config_new(request_rec *r);
   
   void *modperl_create_srv_config(ap_pool_t *p, server_rec *s);
   
  
  
  
  1.8       +7 -24     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.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- modperl_interp.c  2000/04/17 07:10:55     1.7
  +++ modperl_interp.c  2000/04/21 05:25:31     1.8
  @@ -102,8 +102,9 @@
       while (head) {
           if (!MpInterpIN_USE(head)) {
               interp = head;
  -            MP_TRACE_i(MP_FUNC, "selected 0x%lx\n",
  -                       (unsigned long)interp);
  +            MP_TRACE_i(MP_FUNC, "selected 0x%lx (perl==0x%lx)\n",
  +                       (unsigned long)interp,
  +                       (unsigned long)interp->perl);
   #ifdef _PTHREAD_H
               MP_TRACE_i(MP_FUNC, "pthread_self == 0x%lx\n",
                          (unsigned long)pthread_self());
  @@ -247,12 +248,6 @@
       ap_register_cleanup(p, (void*)mip,
                           modperl_interp_pool_destroy, ap_null_cleanup);
   
  -
  -    /* XXX: should only bother selecting an interpreter
  -     * if one is needed for the request
  -     */
  -    ap_hook_post_read_request(modperl_interp_select, NULL, NULL, HOOK_FIRST);
  -
       scfg->mip = mip;
   }
   
  @@ -288,26 +283,14 @@
       return APR_SUCCESS;
   }
   
  -int modperl_interp_select(request_rec *r)
  +modperl_interp_t *modperl_interp_select(request_rec *r)
   {
       modperl_interp_t *interp = modperl_interp_get(r->server);
  -
  -    /* XXX: stash interp pointer in r->per_request */
   
  -    if (MpInterpPUTBACK(interp)) {
  -        ap_register_cleanup(r->pool, (void*)interp,
  -                            modperl_interp_unselect, ap_null_cleanup);
  -    }
  -
  -    if (1) { /* testing concurrent callbacks into the Perl runtime(s) */
  -        dTHXa(interp->perl);
  -        SV *sv = get_sv("Apache::Server::Perl", TRUE);
  -        sv_setref_pv(sv, Nullch, (void*)interp->perl);
  -        eval_pv("printf STDERR qq(Perl == 0x%lx\n), "
  -                "$$Apache::Server::Perl", TRUE);
  -    }
  +    ap_register_cleanup(r->pool, (void*)interp,
  +                        modperl_interp_unselect, ap_null_cleanup);
   
  -    return OK;
  +    return interp;
   }
   
   #else
  
  
  
  1.5       +1 -1      modperl-2.0/src/modules/perl/modperl_interp.h
  
  Index: modperl_interp.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_interp.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- modperl_interp.h  2000/04/16 01:33:56     1.4
  +++ modperl_interp.h  2000/04/21 05:25:31     1.5
  @@ -18,7 +18,7 @@
   
   ap_status_t modperl_interp_unselect(void *data);
   
  -int modperl_interp_select(request_rec *r);
  +modperl_interp_t *modperl_interp_select(request_rec *r);
   
   ap_status_t modperl_interp_pool_destroy(void *data);
   
  
  
  
  1.9       +4 -1      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.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- modperl_types.h   2000/04/18 22:59:15     1.8
  +++ modperl_types.h   2000/04/21 05:25:31     1.9
  @@ -98,8 +98,11 @@
   } modperl_dir_config_t;
   
   typedef struct {
  +#ifdef USE_ITHREADS
  +    modperl_interp_t *interp;
  +#endif
       HV *pnotes;
  -} modperl_per_request_config_t;
  +} modperl_request_config_t;
   
   typedef struct {
       SV *obj; /* object or classname if cv is a method */
  
  
  

Reply via email to