# 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 *);
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;
#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)