X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftimer.lisp;h=3280bd2e260e38971d8ab95f2b7f02a5229742e7;hb=22a6702974b7d6ff4e8f2b3b7b5ff446fc632de0;hp=9ee608961dc5c80c38138bb1ea5fe365f92ba80d;hpb=d27e4848d1b93cb08de9cb02d82e4ce5d0663c68;p=sbcl.git diff --git a/src/code/timer.lisp b/src/code/timer.lisp index 9ee6089..3280bd2 100644 --- a/src/code/timer.lisp +++ b/src/code/timer.lisp @@ -208,9 +208,9 @@ from now. For timers with a repeat interval it returns true." ,@body))) (defun under-scheduler-lock-p () - #!-sb!thread + #!-sb-thread t - #!+sb!thread + #!+sb-thread (eq sb!thread:*current-thread* (sb!thread:mutex-value *scheduler-lock*))) (defparameter *schedule* (make-priority-queue :key #'%timer-expire-time)) @@ -339,19 +339,21 @@ triggers." (sb!thread:interrupt-thread-error (c) (warn c))))))) +;; 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)))) @@ -360,9 +362,13 @@ triggers." "Execute the body, asynchronously interrupting it and signalling a TIMEOUT condition after at least EXPIRES seconds have passed." (with-unique-names (timer) - `(let ((,timer (make-timer (lambda () - (cerror "Continue" 'sb!ext::timeout))))) - (schedule-timer ,timer ,expires) - (unwind-protect - (progn ,@body) - (unschedule-timer ,timer))))) + ;; FIXME: a temporary compatibility workaround for CLX, if unsafe + ;; unwinds are handled revisit it. + `(if (> ,expires 0) + (let ((,timer (make-timer (lambda () + (cerror "Continue" 'sb!ext::timeout))))) + (schedule-timer ,timer ,expires) + (unwind-protect + (progn ,@body) + (unschedule-timer ,timer))) + (progn ,@body))))