From: Vincent Pit Date: Mon, 6 Apr 2015 19:50:50 +0000 (-0300) Subject: Make sure we don't take the OP_REFCNT mutex twice on perl 5.9.2 and below X-Git-Tag: v0.35~5 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=commitdiff_plain;h=7645d1927c141596242b284b6fba4213264e5775 Make sure we don't take the OP_REFCNT mutex twice on perl 5.9.2 and below --- diff --git a/indirect.xs b/indirect.xs index 485c331..bd52eee 100644 --- a/indirect.xs +++ b/indirect.xs @@ -151,12 +151,33 @@ # define MY_CXT_CLONE NOOP #endif +#if I_THREADSAFE +/* We must use preexistent global mutexes or we will never be able to destroy + * them. */ +# if I_HAS_PERL(5, 9, 3) +# define I_LOADED_LOCK MUTEX_LOCK(&PL_my_ctx_mutex) +# define I_LOADED_UNLOCK MUTEX_UNLOCK(&PL_my_ctx_mutex) +# else +# define I_LOADED_LOCK OP_REFCNT_LOCK +# define I_LOADED_UNLOCK OP_REFCNT_UNLOCK +# endif +#else +# define I_LOADED_LOCK NOOP +# define I_LOADED_UNLOCK NOOP +#endif + #if defined(OP_CHECK_MUTEX_LOCK) && defined(OP_CHECK_MUTEX_UNLOCK) # define I_CHECK_MUTEX_LOCK OP_CHECK_MUTEX_LOCK # define I_CHECK_MUTEX_UNLOCK OP_CHECK_MUTEX_UNLOCK -#else +#elif I_HAS_PERL(5, 9, 3) # define I_CHECK_MUTEX_LOCK OP_REFCNT_LOCK # define I_CHECK_MUTEX_UNLOCK OP_REFCNT_UNLOCK +#else +/* Before perl 5.9.3, indirect_ck_*() calls are already protected by the + * I_LOADED mutex, which falls back to the OP_REFCNT mutex. Make sure we don't + * lock it twice. */ +# define I_CHECK_MUTEX_LOCK NOOP +# define I_CHECK_MUTEX_UNLOCK NOOP #endif typedef OP *(*indirect_ck_t)(pTHX_ OP *); @@ -208,16 +229,6 @@ static U32 indirect_loaded = 0; static ptable *indirect_loaded_cxts = NULL; -/* We must use preexistent global mutexes or we will never be able to destroy - * them. */ -#if I_HAS_PERL(5, 9, 3) -# define I_LOADED_LOCK MUTEX_LOCK(&PL_my_ctx_mutex) -# define I_LOADED_UNLOCK MUTEX_UNLOCK(&PL_my_ctx_mutex) -#else -# define I_LOADED_LOCK OP_REFCNT_LOCK -# define I_LOADED_UNLOCK OP_REFCNT_UNLOCK -#endif - static int indirect_is_loaded(pTHX_ void *cxt) { #define indirect_is_loaded(C) indirect_is_loaded(aTHX_ (C)) int res = 0; @@ -266,9 +277,6 @@ static int indirect_clear_loaded_locked(pTHX_ void *cxt) { #else -#define I_LOADED_LOCK NOOP -#define I_LOADED_UNLOCK NOOP - #define indirect_is_loaded(C) (indirect_loaded > 0) #define indirect_set_loaded_locked(C) ((indirect_loaded++ <= 0) ? 1 : 0) #define indirect_clear_loaded_locked(C) ((--indirect_loaded <= 0) ? 1 : 0)