X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftimer.lisp;h=36235acaf648eade8ffcfcbc2e97adb3015a54e1;hb=aab81dccfb1a311eac523a855004a3669340aca6;hp=774ee2b4a6f768e0b039c1d565f836562f764b64;hpb=617d4fa1db5a4a11564e7c59bfb684c7eb25633d;p=sbcl.git diff --git a/src/code/timer.lisp b/src/code/timer.lisp index 774ee2b..36235ac 100644 --- a/src/code/timer.lisp +++ b/src/code/timer.lisp @@ -65,7 +65,7 @@ (aref heap 0))) (defun heap-extract (heap i &key (key #'identity) (test #'>=)) - (when (< (length heap) i) + (unless (> (length heap) i) (error "Heap underflow")) (prog1 (aref heap i) @@ -200,8 +200,9 @@ from now. For timers with a repeat interval it returns true." (defvar *scheduler-lock* (sb!thread:make-mutex :name "Scheduler lock")) (defmacro with-scheduler-lock ((&optional) &body body) - ;; don't let the SIGALRM handler mess things up - `(sb!thread::call-with-system-mutex (lambda () ,@body) *scheduler-lock*)) + ;; Don't let the SIGALRM handler mess things up. + `(sb!thread::with-system-mutex (*scheduler-lock*) + ,@body)) (defun under-scheduler-lock-p () #!-sb-thread @@ -292,10 +293,13 @@ triggers." ;;; Not public, but related (defun reschedule-timer (timer) - (with-scheduler-lock () - (setf (%timer-expire-time timer) (+ (get-internal-real-time) - (%timer-repeat-interval timer))) - (%schedule-timer timer))) + (let ((thread (%timer-thread timer))) + (if (and (sb!thread::thread-p thread) (not (sb!thread:thread-alive-p thread))) + (unschedule-timer timer) + (with-scheduler-lock () + (setf (%timer-expire-time timer) (+ (get-internal-real-time) + (%timer-repeat-interval timer))) + (%schedule-timer timer))))) ;;; Expiring timers