@@ -48,6 +48,7 @@ modperl_interp_t *modperl_interp_new(modperl_interp_pool_t *mip,
4848
4949 interp -> mip = mip ;
5050 interp -> refcnt = 0 ;
51+ MUTEX_INIT (& interp -> lock );
5152
5253 if (perl ) {
5354#ifdef MP_USE_GTOP
@@ -112,7 +113,7 @@ void modperl_interp_destroy(modperl_interp_t *interp)
112113 void * * handles ;
113114 dTHXa (interp -> perl );
114115
115- PERL_SET_CONTEXT (interp -> perl );
116+ PERL_SET_CONTEXT (aTHX );
116117
117118 MP_TRACE_i (MP_FUNC , "interp == 0x%lx / perl: 0x%lx" ,
118119 (unsigned long )interp , (unsigned long )interp -> perl );
@@ -124,11 +125,13 @@ void modperl_interp_destroy(modperl_interp_t *interp)
124125
125126 handles = modperl_xs_dl_handles_get (aTHX );
126127
127- modperl_perl_destruct (interp -> perl );
128+ modperl_perl_destruct (aTHX );
128129
129130 modperl_xs_dl_handles_close (handles );
130131
132+ MUTEX_DESTROY (& interp -> lock );
131133 free (interp );
134+
132135}
133136
134137apr_status_t modperl_interp_cleanup (void * data )
@@ -257,6 +260,7 @@ static apr_status_t modperl_interp_pool_unselect(void *data)
257260 interp , interp -> refcnt );
258261 interp -> refcnt = 1 ;
259262 }
263+ interp -> pool = NULL ;
260264 return modperl_interp_unselect (data );
261265}
262266
@@ -265,20 +269,22 @@ apr_status_t modperl_interp_unselect(void *data)
265269 modperl_interp_t * interp = (modperl_interp_t * )data ;
266270 modperl_interp_pool_t * mip = interp -> mip ;
267271 modperl_tipool_t * tipool = mip -> tipool ;
268-
272+ MUTEX_LOCK ( & interp -> lock );
269273 MP_ASSERT (interp && MpInterpIN_USE (interp ) && interp -> refcnt > 0 );
270274 MP_TRACE_i (MP_FUNC , "unselect(interp=%pp): refcnt=%d" ,
271275 interp , interp -> refcnt );
272276
273277 if (-- interp -> refcnt > 0 ) {
274278 MP_TRACE_i (MP_FUNC , "interp=0x%lx, refcnt=%d -- interp still in use" ,
275279 (unsigned long )interp , interp -> refcnt );
280+ MUTEX_UNLOCK (& interp -> lock );
276281 return APR_SUCCESS ;
277282 }
278283
279284 if (!MpInterpIN_USE (interp )){
280285 MP_TRACE_i (MP_FUNC , "interp=0x%pp, refcnt=%d -- interp already not in use" ,
281286 interp , interp -> refcnt );
287+ MUTEX_UNLOCK (& interp -> lock );
282288 return APR_SUCCESS ;
283289 }
284290
@@ -301,6 +307,7 @@ apr_status_t modperl_interp_unselect(void *data)
301307 MP_TRACE_i (MP_FUNC , "interp=%pp freed, tipool(size=%ld, in_use=%ld)" ,
302308 interp , tipool -> size , tipool -> in_use );
303309 }
310+ MUTEX_UNLOCK (& interp -> lock );
304311 return APR_SUCCESS ;
305312}
306313
@@ -450,9 +457,14 @@ modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c, server_rec
450457 if (c )
451458 ccfg = modperl_config_con_get (c );
452459
460+ static perl_mutex lock = PTHREAD_MUTEX_INITIALIZER ;
461+ MUTEX_LOCK (& lock );
453462 if (p && (interp = modperl_interp_pool_get (p )) && MpInterpIN_USE (interp )) {
463+ MUTEX_LOCK (& interp -> lock );
464+ MUTEX_UNLOCK (& lock );
454465 interp -> refcnt ++ ;
455466 interp -> num_requests ++ ;
467+ MUTEX_UNLOCK (& interp -> lock );
456468 MP_TRACE_i (MP_FUNC ,
457469 "found interp 0x%lx (perl=0x%pp) in r->pool config, refcnt=%d" ,
458470 (unsigned long )interp , interp -> perl , interp -> refcnt );
@@ -463,6 +475,8 @@ modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c, server_rec
463475 MP_TRACE_i (MP_FUNC ,
464476 "fetching interp for %s:%d" , s -> server_hostname , s -> port );
465477 interp = modperl_interp_get (s );
478+ MUTEX_LOCK (& interp -> lock );
479+ MUTEX_UNLOCK (& lock );
466480 MP_TRACE_i (MP_FUNC , " --> got %pp (perl=%pp)" , interp , interp -> perl );
467481 ++ interp -> num_requests ; /* should only get here once per request */
468482 interp -> refcnt = 1 ;
@@ -499,6 +513,7 @@ modperl_interp_t *modperl_interp_select(request_rec *r, conn_rec *c, server_rec
499513 */
500514 interp -> refcnt ++ , set_interp (p ), interp -> pool = p ;
501515
516+ MUTEX_UNLOCK (& interp -> lock );
502517 return interp ;
503518}
504519
0 commit comments