-;;; timer.el --- run a function with args at some time in future.
+;;; timer.el --- run a function with args at some time in future
;; Copyright (C) 1996 Free Software Foundation, Inc.
(defun timer-set-time (timer time &optional delta)
"Set the trigger time of TIMER to TIME.
TIME must be in the internal format returned by, e.g., `current-time'.
-If optional third argument DELTA is a non-zero integer, make the timer
+If optional third argument DELTA is a positive number, make the timer
fire repeatedly that many seconds apart."
(or (timerp timer)
(error "Invalid timer"))
(setq low (+ low (floor secs)))
;; Normalize
- (setq low (+ low (/ micro 1000000)))
+ ;; `/' rounds towards zero while `mod' returns a positive number,
+ ;; so we can't rely on (= a (+ (* 100 (/ a 100)) (mod a 100))).
+ (setq low (+ low (/ micro 1000000) (if (< micro 0) -1 0)))
(setq micro (mod micro 1000000))
- (setq high (+ high (/ low 65536)))
+ (setq high (+ high (/ low 65536) (if (< low 0) -1 0)))
(setq low (logand low 65535))
(list high low (and (/= micro 0) micro))))
(defun timer-inc-time (timer secs &optional usecs)
"Increment the time set in TIMER by SECS seconds and USECS microseconds.
-SECS may be a fraction."
+SECS may be a fraction. If USECS is omitted, that means it is zero."
(let ((time (timer-relative-time
(list (aref timer 1) (aref timer 2) (aref timer 3))
secs
(aset timer 3 (or (nth 2 time) 0))))
(defun timer-set-time-with-usecs (timer time usecs &optional delta)
- "Set the trigger time of TIMER to TIME.
+ "Set the trigger time of TIMER to TIME plus USECS.
TIME must be in the internal format returned by, e.g., `current-time'.
-If optional third argument DELTA is a non-zero integer, make the timer
+The microsecond count from TIME is ignored, and USECS is used instead.
+If optional fourth argument DELTA is a positive number, make the timer
fire repeatedly that many seconds apart."
(or (timerp timer)
(error "Invalid timer"))
- (aset timer 1 (car time))
- (aset timer 2 (if (consp (cdr time)) (car (cdr time)) (cdr time)))
+ (aset timer 1 (nth 0 time))
+ (aset timer 2 (nth 1 time))
(aset timer 3 usecs)
(aset timer 4 (and (numberp delta) (> delta 0) delta))
timer)
+(make-obsolete 'timer-set-time-with-usecs
+ "use `timer-set-time' and `timer-inc-time' instead."
+ "21.4")
(defun timer-set-function (timer function &optional args)
"Make TIMER call FUNCTION with optional ARGS when triggering."
(let ((timer (timer-create)))
(timer-set-function timer function args)
(timer-set-idle-time timer secs repeat)
- (timer-activate-when-idle timer t)
+ (timer-activate-when-idle timer)
timer))
\f
(defun with-timeout-handler (tag)