]> git.eshelyaron.com Git - emacs.git/commitdiff
New function.
authorRichard M. Stallman <rms@gnu.org>
Mon, 14 Apr 1997 11:09:20 +0000 (11:09 +0000)
committerRichard M. Stallman <rms@gnu.org>
Mon, 14 Apr 1997 11:09:20 +0000 (11:09 +0000)
(timer-max-repeats): New variable.
(timer-event-handler): Avoid rerunning a timer many times
if real time has "jumped" forward.

lisp/timer.el

index 1a34375566150ea95f1615b8e2aadf72e119c4f8..3b6382989cbaf1268820c1d64d2325f9f96d8346 100644 (file)
@@ -248,6 +248,17 @@ fire repeatedly that many seconds apart."
 (defvar timer-event-last-1 nil)
 (defvar timer-event-last nil)
 
+(defvar timer-max-repeats 10
+  "*Maximum number of times to repeat a timer, if real time jumps.")
+
+(defun timer-until (timer time)
+  "Calculate number of seconds from when TIMER will run, until TIME.
+TIMER is a timer, and stands for the time when its next repeat is scheduled.
+TIME is a time-list.
+  (let ((high (- (car time) (aref timer 1)))
+       (low (- (nth 1 time) (aref timer 2))))
+    (+ low (* high 65536))))
+  
 (defun timer-event-handler (event)
   "Call the handler for the timer in the event EVENT."
   (interactive "e")
@@ -269,6 +280,15 @@ fire repeatedly that many seconds apart."
              (if (aref timer 7)
                  (timer-activate-when-idle timer)
                (timer-inc-time timer (aref timer 4) 0)
+               ;; If real time has jumped forward,
+               ;; perhaps because Emacs was suspended for a long time,
+               ;; limit how many times things get repeated.
+               (if (and (numberp timer-max-repeats)
+                        (< 0 (timer-until timer (current-time))))
+                   (let ((repeats (/ (timer-until timer (current-time))
+                                     (aref timer 4))))
+                     (if (> repeats timer-max-repeats)
+                         (timer-inc-time timer (* (aref timer 4) repeats)))))
                (timer-activate timer))))
       (error "Bogus timer event"))))