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 {