From ae6e0d2d4d80dbbbd0c483051f0c8cd8fa3654fb Mon Sep 17 00:00:00 2001 From: Nikodemus Siivola Date: Mon, 19 May 2008 14:06:28 +0000 Subject: [PATCH] 1.0.16.39: small lisp-side interrupt handling improvements * In INVOKE-INTERRUPTION, disable interrupts before doing the interrupt handler bindings -- no point in making the window for recursive interrupts any bigger then it already is. * Similarly, ALLOW-WITH-INTERRUPTS only after the *STACK-TOP-HINT* has been computed. (Actually, the stack top hint computation should not be done for all interrupts, instead it would be better to add an argument to indicate we want to start from the interrupted frame to MAP-BACKTRACE.) * Declare the &REST argument of (FLET RUN-HANDLER) dynamic extent. --- src/code/target-signal.lisp | 10 +++++----- version.lisp-expr | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/code/target-signal.lisp b/src/code/target-signal.lisp index 073b4c94a..95710d9dd 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 (dynamic-extent args)) (in-interruption () (apply handler args)))) (without-gcing diff --git a/version.lisp-expr b/version.lisp-expr index 4a1cf0d15..d795dbd4f 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"1.0.16.38" +"1.0.16.39"