Catch die in %SIG handler and unblock the signal before re-dying.
Nick Ing-Simmons [Thu, 11 Jan 2001 20:57:44 +0000 (20:57 +0000)]
This make Linux work _without_ sigsetjmp().
Turn off sigsetjmp() to see what else it does.
May need Configure probe for sigprocmask() if anything has sigaction()
but not sigprocmask().

p4raw-id: //depot/perlio@8407

mg.c
scope.h

diff --git a/mg.c b/mg.c
index ca06b89..a7566e3 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -2161,6 +2161,8 @@ Perl_sighandler(int sig)
     U32 flags = 0;
     I32 o_save_i = PL_savestack_ix;
     XPV *tXpv = PL_Xpv;
+    sigjmp_buf jmp;
+    Sighandler_t handler;
 
 #if defined(WIN32) && defined(PERL_IMPLICIT_CONTEXT)
     PERL_SET_THX(aTHXo);       /* fake TLS, see above */
@@ -2223,9 +2225,26 @@ Perl_sighandler(int sig)
     PUSHs(sv);
     PUTBACK;
 
-    call_sv((SV*)cv, G_DISCARD);
+    call_sv((SV*)cv, G_DISCARD|G_EVAL);
 
     POPSTACK;
+    if (SvTRUE(ERRSV)) {
+#ifdef HAS_SIGACTION
+       /* Handler "died", for example to get out of a restart-able read().
+        * Before we re-do that on its behalf re-enable the signal which was
+        * blocked by the system when we entered.
+        */
+       sigset_t set;
+       sigemptyset(&set);
+       sigaddset(&set,sig);
+       sigprocmask(SIG_UNBLOCK, &set, NULL);
+#else
+       /* Not clear if this will work */
+       (void)rsignal(sig, SIG_IGN);
+       (void)rsignal(sig, PL_sighandlerp);
+#endif
+       Perl_die(aTHX_ Nullch);
+    }
 cleanup:
     if (flags & 1)
        PL_savestack_ix -= 8; /* Unprotect save in progress. */
diff --git a/scope.h b/scope.h
index d45bd94..0ceb6ba 100644 (file)
--- a/scope.h
+++ b/scope.h
@@ -36,7 +36,7 @@
 #define SAVEt_PADSV            35
 
 #ifndef SCOPE_SAVES_SIGNAL_MASK
-#define SCOPE_SAVES_SIGNAL_MASK 1
+#define SCOPE_SAVES_SIGNAL_MASK 0
 #endif
 
 #define SSCHECK(need) if (PL_savestack_ix + need > PL_savestack_max) savestack_grow()