X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftimer.lisp;h=3ad04ea8cb20d570f873f3bce02a2ef1783f9e0a;hb=3106aee96a20d1a76a114e504bc2931f8196cace;hp=3730a209f3c3e2642bd8d01edd96f2cdd560e66e;hpb=20c447c9f46c59f251fb88838990ab37b986aa8f;p=sbcl.git diff --git a/src/code/timer.lisp b/src/code/timer.lisp index 3730a20..3ad04ea 100644 --- a/src/code/timer.lisp +++ b/src/code/timer.lisp @@ -337,21 +337,24 @@ triggers." (handler-case (sb!thread:interrupt-thread thread function) (sb!thread:interrupt-thread-error (c) - (warn c))))))) + (declare (ignore c)) + (warn "Timer ~S failed to interrupt thread ~S." timer thread))))))) +;; Called from the signal handler. (defun run-expired-timers () (unwind-protect - (let (timer) - (loop - (with-scheduler-lock () - (setq timer (peek-schedule)) - (unless (and timer - (> (get-internal-real-time) - (%timer-expire-time timer))) - (return-from run-expired-timers nil)) - (assert (eq timer (priority-queue-extract-maximum *schedule*)))) - ;; run the timer without the lock - (run-timer timer))) + (with-interrupts + (let (timer) + (loop + (with-scheduler-lock () + (setq timer (peek-schedule)) + (unless (and timer + (> (get-internal-real-time) + (%timer-expire-time timer))) + (return-from run-expired-timers nil)) + (assert (eq timer (priority-queue-extract-maximum *schedule*)))) + ;; run the timer without the lock + (run-timer timer)))) (with-scheduler-lock () (set-system-timer))))