This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Perl_sighandler: only inc SS_ix for unsafe signals
authorDavid Mitchell <davem@iabyn.com>
Sat, 19 Mar 2011 21:49:34 +0000 (21:49 +0000)
committerDavid Mitchell <davem@iabyn.com>
Sat, 19 Mar 2011 22:03:40 +0000 (22:03 +0000)
Perl_sighandler currently increments the savestack by 5
before running a signal handler, to avoid messing with a
partially completed SS push operation that's been interrupted.

This is irrelevant for safe signals, so make this action conditional on
unsafe signals only.

mg.c

diff --git a/mg.c b/mg.c
index 447d86c..331e34b 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -3028,12 +3028,14 @@ Perl_sighandler(int sig)
                exit(sig);
        }
 
-    /* Max number of items pushed there is 3*n or 4. We cannot fix
-       infinity, so we fix 4 (in fact 5): */
-    if (PL_savestack_ix + 15 <= PL_savestack_max) {
-       flags |= 1;
-       PL_savestack_ix += 5;           /* Protect save in progress. */
-       SAVEDESTRUCTOR_X(S_unwind_handler_stack, NULL);
+    if (PL_signals &  PERL_SIGNALS_UNSAFE_FLAG) {
+       /* Max number of items pushed there is 3*n or 4. We cannot fix
+          infinity, so we fix 4 (in fact 5): */
+       if (PL_savestack_ix + 15 <= PL_savestack_max) {
+           flags |= 1;
+           PL_savestack_ix += 5;               /* Protect save in progress. */
+           SAVEDESTRUCTOR_X(S_unwind_handler_stack, NULL);
+       }
     }
     /* sv_2cv is too complicated, try a simpler variant first: */
     if (!SvROK(PL_psig_ptr[sig]) || !(cv = MUTABLE_CV(SvRV(PL_psig_ptr[sig])))
@@ -3057,9 +3059,11 @@ Perl_sighandler(int sig)
     flags |= 8;
     SAVEFREESV(sv);
 
-    /* make sure our assumption about the size of the SAVEs are correct:
-     * 3 for SAVEDESTRUCTOR_X, 2 for SAVEFREESV */
-    assert(old_ss_ix + 2 + ((flags & 1) ? 3+5 : 0)  == PL_savestack_ix);
+    if (PL_signals &  PERL_SIGNALS_UNSAFE_FLAG) {
+       /* make sure our assumption about the size of the SAVEs are correct:
+        * 3 for SAVEDESTRUCTOR_X, 2 for SAVEFREESV */
+       assert(old_ss_ix + 2 + ((flags & 1) ? 3+5 : 0)  == PL_savestack_ix);
+    }
 
     PUSHSTACKi(PERLSI_SIGNAL);
     PUSHMARK(SP);