summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dist/threads-shared/shared.xs23
1 files changed, 23 insertions, 0 deletions
diff --git a/dist/threads-shared/shared.xs b/dist/threads-shared/shared.xs
index a1c6925f29..720e3b6749 100644
--- a/dist/threads-shared/shared.xs
+++ b/dist/threads-shared/shared.xs
@@ -1167,6 +1167,23 @@ Perl_shared_object_destroy(pTHX_ SV *sv)
}
#endif
+/* veto signal despatch if we have the lock */
+
+#ifdef PL_signalhook
+
+STATIC despatch_signals_proc_t prev_signal_hook = NULL;
+
+STATIC void
+S_shared_signal_hook(pTHX) {
+ int us;
+ MUTEX_LOCK(&PL_sharedsv_lock.mutex);
+ us = (PL_sharedsv_lock.owner == aTHX);
+ MUTEX_UNLOCK(&PL_sharedsv_lock.mutex);
+ if (us)
+ return; /* try again later */
+ CALL_FPTR(prev_signal_hook)(aTHX);
+}
+#endif
/* Saves a space for keeping SVs wider than an interpreter. */
@@ -1184,6 +1201,12 @@ Perl_sharedsv_init(pTHX)
#ifdef PL_destroyhook
PL_destroyhook = &Perl_shared_object_destroy;
#endif
+#ifdef PL_signalhook
+ if (!prev_signal_hook) {
+ prev_signal_hook = PL_signalhook;
+ PL_signalhook = &S_shared_signal_hook;
+ }
+#endif
}
#endif /* USE_ITHREADS */