From: Alan T. DeKok Date: Thu, 1 Dec 2011 13:21:03 +0000 (+0100) Subject: Perl clone should be called sequentially, not in parallel. X-Git-Tag: release_2_2_0~241 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ecb3cd1dbedb764ab98532dae5e0b5bfc9571b00;p=thirdparty%2Ffreeradius-server.git Perl clone should be called sequentially, not in parallel. Adding a mutex fixes this. Patch from Eike Dehling --- diff --git a/src/modules/rlm_perl/rlm_perl.c b/src/modules/rlm_perl/rlm_perl.c index 5c82e896db8..4682ba507bc 100644 --- a/src/modules/rlm_perl/rlm_perl.c +++ b/src/modules/rlm_perl/rlm_perl.c @@ -77,6 +77,8 @@ typedef struct perl_inst { char *perl_flags; PerlInterpreter *perl; pthread_key_t *thread_key; + + pthread_mutex_t clone_mutex; } PERL_INST; /* * A mapping of configuration file names to internal variables. @@ -434,6 +436,8 @@ static int perl_instantiate(CONF_SECTION *conf, void **instance) */ #ifdef USE_ITHREADS + pthread_mutex_init(&inst->clone_mutex, NULL); + inst->thread_key = rad_malloc(sizeof(*inst->thread_key)); memset(inst->thread_key,0,sizeof(*inst->thread_key)); @@ -656,8 +660,10 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name) HV *rad_request_hv; HV *rad_request_proxy_hv; HV *rad_request_proxy_reply_hv; - + #ifdef USE_ITHREADS + pthread_mutex_lock(&inst->clone_mutex); + PerlInterpreter *interp; interp = rlm_perl_clone(inst->perl,inst->thread_key); @@ -665,9 +671,12 @@ static int rlmperl_call(void *instance, REQUEST *request, char *function_name) dTHXa(interp); PERL_SET_CONTEXT(interp); } + + pthread_mutex_unlock(&inst->clone_mutex); #else PERL_SET_CONTEXT(inst->perl); #endif + { dSP; @@ -974,6 +983,7 @@ static int perl_detach(void *instance) #ifdef USE_ITHREADS rlm_perl_destruct(inst->perl); + pthread_mutex_destroy(&inst->clone_mutex); #else perl_destruct(inst->perl); perl_free(inst->perl);