66 lines
1.8 KiB
Diff
66 lines
1.8 KiB
Diff
commit ecb3cd1dbedb764ab98532dae5e0b5bfc9571b00
|
|
Author: Alan T. DeKok <aland@freeradius.org>
|
|
Date: Thu Dec 1 14:21:03 2011 +0100
|
|
|
|
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 5c82e89..4682ba5 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);
|