diff options
-rw-r--r-- | dist/threads-shared/shared.xs | 23 |
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 */ |