fix bogus deadlocks from interrupts and GCs
[sbcl.git] / src / code / target-signal.lisp
index bea8892..2ae4a88 100644 (file)
     (let ((*unblock-deferrables-on-enabling-interrupts-p* t))
       (with-interrupt-bindings
         (let ((sb!debug:*stack-top-hint*
-               (nth-value 1 (sb!kernel:find-interrupted-name-and-frame))))
-          (allow-with-interrupts
-            (nlx-protect (funcall function)
-                         ;; We've been running with deferrables
-                         ;; blocked in Lisp called by a C signal
-                         ;; handler. If we return normally the sigmask
-                         ;; in the interrupted context is restored.
-                         ;; However, if we do an nlx the operating
-                         ;; system will not restore it for us.
-                         (when *unblock-deferrables-on-enabling-interrupts-p*
-                           ;; This means that storms of interrupts
-                           ;; doing an nlx can still run out of stack.
-                           (unblock-deferrable-signals)))))))))
+                (nth-value 1 (sb!kernel:find-interrupted-name-and-frame))))
+          (sb!thread::without-thread-waiting-for (:already-without-interrupts t)
+              (allow-with-interrupts
+                (nlx-protect (funcall function)
+                             ;; We've been running with deferrables
+                             ;; blocked in Lisp called by a C signal
+                             ;; handler. If we return normally the sigmask
+                             ;; in the interrupted context is restored.
+                             ;; However, if we do an nlx the operating
+                             ;; system will not restore it for us.
+                             (when *unblock-deferrables-on-enabling-interrupts-p*
+                               ;; This means that storms of interrupts
+                               ;; doing an nlx can still run out of stack.
+                               (unblock-deferrable-signals))))))))))
 
 (defmacro in-interruption ((&key) &body body)
   #!+sb-doc