dougm       00/05/26 13:34:51

  Modified:    src/modules/perl modperl_callback.c modperl_callback.h
                        modperl_interp.c modperl_log.h modperl_tipool.c
                        modperl_tipool.h modperl_types.h
  Log:
  don't cache get_cv() in the server config structure
  fixup max/min logic
  
  Revision  Changes    Path
  1.10      +18 -8     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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- modperl_callback.c        2000/05/01 23:57:52     1.9
  +++ modperl_callback.c        2000/05/26 20:34:49     1.10
  @@ -223,11 +223,25 @@
       return 0;
   }
   
  -int modperl_callback(pTHX_ modperl_handler_t *handler)
  +int modperl_callback(pTHX_ modperl_handler_t *handler, ap_pool_t *p)
   {
       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
  +         */
  +        modperl_handler_t *new_handler = 
  +            modperl_handler_new(p, (void*)handler->name,
  +                                MP_HANDLER_TYPE_CHAR);
  +        handler = new_handler;
  +    }
  +#endif
  +
       if (!MpHandlerPARSED(handler)) {
           if (!modperl_handler_parse(aTHX_ handler)) {
               MP_TRACE_h(MP_FUNC, "failed to parse handler `%s'\n",
  @@ -278,12 +292,6 @@
           status = HTTP_INTERNAL_SERVER_ERROR;
       }
   
  -    /* XXX: since the interpreter from which this data was allocated
  -     * can be knocked off (PerlInterpMax{Spare,Requests}, the parse caching
  -     * is broken.
  -     */
  -    modperl_handler_unparse(handler);
  -
       return status;
   }
   
  @@ -303,6 +311,7 @@
       MP_dSCFG(s);
       MP_dDCFG;
       modperl_handler_t **handlers;
  +    ap_pool_t *p = NULL;
       MpAV *av = NULL;
       int i, status = OK;
       const char *desc = NULL;
  @@ -338,6 +347,7 @@
   
   #ifdef USE_ITHREADS
       if (r || c) {
  +        p = c ? c->pool : r->pool;
           interp = modperl_interp_select(r, c, s);
           aTHX = interp->perl;
       }
  @@ -353,7 +363,7 @@
       handlers = (modperl_handler_t **)av->elts;
   
       for (i=0; i<av->nelts; i++) {
  -        status = modperl_callback(aTHX_ handlers[i]);
  +        status = modperl_callback(aTHX_ handlers[i], p);
           MP_TRACE_h(MP_FUNC, "%s returned %d\n",
                      handlers[i]->name, status);
       }
  
  
  
  1.6       +1 -1      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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- modperl_callback.h        2000/04/27 22:02:04     1.5
  +++ modperl_callback.h        2000/05/26 20:34:49     1.6
  @@ -23,7 +23,7 @@
   
   int modperl_handler_parse(pTHX_ modperl_handler_t *handler);
   
  -int modperl_callback(pTHX_ modperl_handler_t *handler);
  +int modperl_callback(pTHX_ modperl_handler_t *handler, ap_pool_t *p);
   
   void modperl_process_callback(int idx, ap_pool_t *p, server_rec *s);
   
  
  
  
  1.13      +6 -3      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.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- modperl_interp.c  2000/05/23 20:54:44     1.12
  +++ modperl_interp.c  2000/05/26 20:34:49     1.13
  @@ -88,11 +88,13 @@
       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());
  +
  +#ifdef MP_TRACE
  +    interp->tid = MP_TIDF;
   #endif
   
  +    MP_TRACE_i(MP_FUNC, "thread == 0x%lx\n", interp->tid);
  +
       MpInterpIN_USE_On(interp);
   
       return interp;
  @@ -117,6 +119,7 @@
   static void *interp_pool_grow(modperl_tipool_t *tipool, void *data)
   {
       modperl_interp_pool_t *mip = (modperl_interp_pool_t *)data;
  +    MP_TRACE_i(MP_FUNC, "adding new interpreter to the pool\n");
       return (void *)modperl_interp_new(mip->ap_pool, mip, mip->parent->perl);
   }
   
  
  
  
  1.3       +9 -0      modperl-2.0/src/modules/perl/modperl_log.h
  
  Index: modperl_log.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_log.h,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- modperl_log.h     2000/04/17 00:02:25     1.2
  +++ modperl_log.h     2000/05/26 20:34:49     1.3
  @@ -7,6 +7,15 @@
   
   #include "modperl_trace.h"
   
  +#ifdef _PTHREAD_H
  +#define modperl_thread_self() pthread_self()
  +#else
  +#define modperl_thread_self() 0
  +#endif
  +
  +#define MP_TIDF \
  +(unsigned long)modperl_thread_self()
  +
   void modperl_trace(char *func, const char *fmt, ...);
   
   void modperl_trace_level_set(char *level);
  
  
  
  1.3       +11 -7     modperl-2.0/src/modules/perl/modperl_tipool.c
  
  Index: modperl_tipool.c
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_tipool.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- modperl_tipool.c  2000/05/26 15:07:52     1.2
  +++ modperl_tipool.c  2000/05/26 20:34:50     1.3
  @@ -309,16 +309,17 @@
           return;
       }
   
  -    max_spare = (tipool->size > tipool->cfg->max_spare);
  +    max_spare = ((tipool->size - tipool->in_use) > tipool->cfg->max_spare);
       max_requests = ((num_requests > 0) &&
                       (num_requests > tipool->cfg->max_requests));
   
       if (max_spare) {
  -        MP_TRACE_i(MP_FUNC, "throttle down (max_spare=%d, %d running)\n",
  -                   tipool->cfg->max_spare, tipool->size);
  +        MP_TRACE_i(MP_FUNC,
  +                   "shrinking pool: max_spare=%d, only %d of %d in use\n",
  +                   tipool->cfg->max_spare, tipool->in_use, tipool->size);
       }
       else if (max_requests) {
  -        MP_TRACE_i(MP_FUNC, "max requests %d reached\n",
  +        MP_TRACE_i(MP_FUNC, "shrinking pool: max requests %d reached\n",
                      tipool->cfg->max_requests);
       }
   
  @@ -333,14 +334,17 @@
                                               listp->data);
           }
   
  -        if (max_requests && (tipool->size < tipool->cfg->min_spare)) {
  +        if (max_requests && ((tipool->size - tipool->in_use) <
  +                             tipool->cfg->min_spare)) {
               if (tipool->func->tipool_rgrow) {
                   void *item =
                       (*tipool->func->tipool_sgrow)(tipool,
                                                     tipool->data);
   
  -                MP_TRACE_i(MP_FUNC, "new item: size %d < %d min_spare\n",
  -                           tipool->size, tipool->cfg->min_spare);
  +                MP_TRACE_i(MP_FUNC,
  +                           "growing pool: min_spare=%d, %d of %d in use\n",
  +                           tipool->cfg->min_spare, tipool->in_use,
  +                           tipool->size);
   
                   modperl_tipool_add(tipool, item);
               }
  
  
  
  1.3       +5 -3      modperl-2.0/src/modules/perl/modperl_tipool.h
  
  Index: modperl_tipool.h
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_tipool.h,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- modperl_tipool.h  2000/05/26 15:07:52     1.2
  +++ modperl_tipool.h  2000/05/26 20:34:50     1.3
  @@ -42,7 +42,9 @@
   
   #define modperl_tipool_wait(tipool) \
       while (tipool->size == tipool->in_use) { \
  -        MP_TRACE_i(MP_FUNC, "waiting for available tipool item\n"); \
  +        MP_TRACE_i(MP_FUNC, \
  +                   "waiting for available tipool item in thread 0x%lx\n", \
  +                   MP_TIDF); \
           MP_TRACE_i(MP_FUNC, "(%d items in use, %d alive)\n", \
                      tipool->in_use, tipool->size); \
           COND_WAIT(&tipool->available, &tipool->tiplock); \
  @@ -53,12 +55,12 @@
       COND_SIGNAL(&tipool->available)
   
   #define modperl_tipool_lock(tipool) \
  -    MP_TRACE_i(MP_FUNC, "about to lock tipool\n"); \
  +    MP_TRACE_i(MP_FUNC, "about to lock tipool in thread 0x%lx\n", MP_TIDF); \
       MUTEX_LOCK(&tipool->tiplock); \
       MP_TRACE_i(MP_FUNC, "aquired tipool lock\n")
   
   #define modperl_tipool_unlock(tipool) \
  -    MP_TRACE_i(MP_FUNC, "about to unlock tipool\n"); \
  +    MP_TRACE_i(MP_FUNC, "about to unlock tipool in thread 0x%lx\n", MP_TIDF); \
       MUTEX_UNLOCK(&tipool->tiplock); \
       MP_TRACE_i(MP_FUNC, "released tipool lock\n")
   
  
  
  
  1.13      +3 -0      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.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- modperl_types.h   2000/05/23 20:54:46     1.12
  +++ modperl_types.h   2000/05/26 20:34:50     1.13
  @@ -41,6 +41,9 @@
       PerlInterpreter *perl;
       int num_requests;
       int flags;
  +#ifdef MP_TRACE
  +    unsigned long tid;
  +#endif
   };
   
   typedef struct {
  
  
  

Reply via email to