X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-signal.lisp;h=8c0f4868c5ddc85e41824db3548330a1fd114d44;hb=5d5894082c39ca44da75d38859d669c7b2108f6a;hp=073b4c94a5b56d2cdea0d981e121b019b3b6f310;hpb=fe420bb47ea909070ee82c6e48642c9ff41dbcc8;p=sbcl.git diff --git a/src/code/target-signal.lisp b/src/code/target-signal.lisp index 073b4c9..8c0f486 100644 --- a/src/code/target-signal.lisp +++ b/src/code/target-signal.lisp @@ -30,8 +30,8 @@ ,@body))) (defun invoke-interruption (function) - (with-interrupt-bindings - (without-interrupts + (without-interrupts + (with-interrupt-bindings ;; Reset signal mask: the C-side handler has blocked all ;; deferrable interrupts before arranging return to lisp. This is ;; safe because we can't get a pending interrupt before we unblock @@ -40,9 +40,8 @@ ;; FIXME: Should we not reset the _entire_ mask, but just ;; restore it to the state before we got the interrupt? (reset-signal-mask) - (allow-with-interrupts - (let ((sb!debug:*stack-top-hint* (nth-value 1 (sb!kernel:find-interrupted-name-and-frame)))) - (funcall function)))))) + (let ((sb!debug:*stack-top-hint* (nth-value 1 (sb!kernel:find-interrupted-name-and-frame)))) + (allow-with-interrupts (funcall function)))))) (defmacro in-interruption ((&key) &body body) #!+sb-doc @@ -93,6 +92,7 @@ (declare (type (or function fixnum (member :default :ignore)) handler)) (/show0 "enable-interrupt") (flet ((run-handler (&rest args) + (declare (truly-dynamic-extent args)) (in-interruption () (apply handler args)))) (without-gcing