Move PERL_ASYNC_CHECK() from POPBLOCK() to the kill case of Perl_apply().
Nicholas Clark [Sun, 18 Apr 2010 12:24:20 +0000 (13:24 +0100)]
This ensures that (safe) signals sent to the same process are still dispatched
within the same statement (as before), without overloading the semantics of
block popping.

cop.h
doio.c

diff --git a/cop.h b/cop.h
index 420a5d1..6c51d73 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -592,7 +592,6 @@ struct block {
 /* Exit a block (RETURN and LAST). */
 #define POPBLOCK(cx,pm)                                                        \
        DEBUG_CX("POP");                                                \
-       PERL_ASYNC_CHECK();                                             \
        cx = &cxstack[cxstack_ix--],                                    \
        newsp            = PL_stack_base + cx->blk_oldsp,               \
        PL_curcop        = cx->blk_oldcop,                              \
diff --git a/doio.c b/doio.c
index eba7b54..98861af 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -1740,6 +1740,7 @@ nothing in the core.
                    }
                }
            }
+           PERL_ASYNC_CHECK();
            break;
        }
 #endif
@@ -1770,6 +1771,7 @@ nothing in the core.
                    tot--;
            }
        }
+       PERL_ASYNC_CHECK();
        break;
 #endif
     case OP_UNLINK: