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 {