aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman2005-10-29 19:47:23 +0000
committerRichard M. Stallman2005-10-29 19:47:23 +0000
commitdbbee529911e49ce1e3eda52632292e09e894f44 (patch)
tree03a73fbf3313e366d12b14dbf124fa7f2865acf6
parent74614ac6c08f9baf1197e2431dc647c6df3dde7f (diff)
downloademacs-dbbee529911e49ce1e3eda52632292e09e894f44.tar.gz
emacs-dbbee529911e49ce1e3eda52632292e09e894f44.zip
(timer-activate, timer-activate-when-idle): New arg REUSE-CELL.
(cancel-timer-internal): New function. (timer-event-handler): Use cancel-timer-internal, and pass the cell it returns to timer-activate...
-rw-r--r--lisp/emacs-lisp/timer.el54
1 files changed, 41 insertions, 13 deletions
diff --git a/lisp/emacs-lisp/timer.el b/lisp/emacs-lisp/timer.el
index 83b01642c56..2aa30220f4f 100644
--- a/lisp/emacs-lisp/timer.el
+++ b/lisp/emacs-lisp/timer.el
@@ -161,8 +161,11 @@ fire repeatedly that many seconds apart."
161 (aset timer 6 args) 161 (aset timer 6 args)
162 timer) 162 timer)
163 163
164(defun timer-activate (timer &optional triggered-p) 164(defun timer-activate (timer &optional triggered-p reuse-cell)
165 "Put TIMER on the list of active timers." 165 "Put TIMER on the list of active timers.
166
167REUSE-CELL, if non-nil, is a cons cell to reuse instead
168of allocating a new one."
166 (if (and (timerp timer) 169 (if (and (timerp timer)
167 (integerp (aref timer 1)) 170 (integerp (aref timer 1))
168 (integerp (aref timer 2)) 171 (integerp (aref timer 2))
@@ -180,20 +183,28 @@ fire repeatedly that many seconds apart."
180 (> (aref timer 3) (aref (car timers) 3))))) 183 (> (aref timer 3) (aref (car timers) 3)))))
181 (setq last timers 184 (setq last timers
182 timers (cdr timers))) 185 timers (cdr timers)))
186 (if reuse-cell
187 (progn
188 (setcar reuse-cell timer)
189 (setcdr reuse-cell timers))
190 (setq reuse-cell (cons timer timers)))
183 ;; Insert new timer after last which possibly means in front of queue. 191 ;; Insert new timer after last which possibly means in front of queue.
184 (if last 192 (if last
185 (setcdr last (cons timer timers)) 193 (setcdr last reuse-cell)
186 (setq timer-list (cons timer timers))) 194 (setq timer-list reuse-cell))
187 (aset timer 0 triggered-p) 195 (aset timer 0 triggered-p)
188 (aset timer 7 nil) 196 (aset timer 7 nil)
189 nil) 197 nil)
190 (error "Invalid or uninitialized timer"))) 198 (error "Invalid or uninitialized timer")))
191 199
192(defun timer-activate-when-idle (timer &optional dont-wait) 200(defun timer-activate-when-idle (timer &optional dont-wait reuse-cell)
193 "Arrange to activate TIMER whenever Emacs is next idle. 201 "Arrange to activate TIMER whenever Emacs is next idle.
194If optional argument DONT-WAIT is non-nil, then enable the 202If optional argument DONT-WAIT is non-nil, then enable the
195timer to activate immediately, or at the right time, if Emacs 203timer to activate immediately, or at the right time, if Emacs
196is already idle." 204is already idle.
205
206REUSE-CELL, if non-nil, is a cons cell to reuse instead
207of allocating a new one."
197 (if (and (timerp timer) 208 (if (and (timerp timer)
198 (integerp (aref timer 1)) 209 (integerp (aref timer 1))
199 (integerp (aref timer 2)) 210 (integerp (aref timer 2))
@@ -211,10 +222,15 @@ is already idle."
211 (> (aref timer 3) (aref (car timers) 3))))) 222 (> (aref timer 3) (aref (car timers) 3)))))
212 (setq last timers 223 (setq last timers
213 timers (cdr timers))) 224 timers (cdr timers)))
225 (if reuse-cell
226 (progn
227 (setcar reuse-cell timer)
228 (setcdr reuse-cell timers))
229 (setq reuse-cell (cons timer timers)))
214 ;; Insert new timer after last which possibly means in front of queue. 230 ;; Insert new timer after last which possibly means in front of queue.
215 (if last 231 (if last
216 (setcdr last (cons timer timers)) 232 (setcdr last reuse-cell)
217 (setq timer-idle-list (cons timer timers))) 233 (setq timer-idle-list reuse-cell))
218 (aset timer 0 (not dont-wait)) 234 (aset timer 0 (not dont-wait))
219 (aset timer 7 t) 235 (aset timer 7 t)
220 nil) 236 nil)
@@ -231,6 +247,18 @@ is already idle."
231 (setq timer-idle-list (delq timer timer-idle-list)) 247 (setq timer-idle-list (delq timer timer-idle-list))
232 nil) 248 nil)
233 249
250;; Remove TIMER from the list of active timers or idle timers.
251;; Only to be used in this file. It returns the cons cell
252;; that was removed from the list.
253(defun cancel-timer-internal (timer)
254 (let ((cell1 (memq timer timer-list))
255 (cell2 (memq timer timer-idle-list)))
256 (if cell1
257 (setq timer-list (delq timer timer-list)))
258 (if cell2
259 (setq timer-idle-list (delq timer timer-idle-list)))
260 (or cell1 cell2)))
261
234;;;###autoload 262;;;###autoload
235(defun cancel-function-timers (function) 263(defun cancel-function-timers (function)
236 "Cancel all timers scheduled by `run-at-time' which would run FUNCTION." 264 "Cancel all timers scheduled by `run-at-time' which would run FUNCTION."
@@ -270,13 +298,13 @@ This function is called, by name, directly by the C code."
270 (setq timer-event-last timer) 298 (setq timer-event-last timer)
271 (let ((inhibit-quit t)) 299 (let ((inhibit-quit t))
272 (if (timerp timer) 300 (if (timerp timer)
273 (let (retrigger) 301 (let (retrigger cell)
274 ;; Delete from queue. 302 ;; Delete from queue. Record the cons cell that was used.
275 (cancel-timer timer) 303 (setq cell (cancel-timer-internal timer))
276 ;; Re-schedule if requested. 304 ;; Re-schedule if requested.
277 (if (aref timer 4) 305 (if (aref timer 4)
278 (if (aref timer 7) 306 (if (aref timer 7)
279 (timer-activate-when-idle timer) 307 (timer-activate-when-idle timer nil cell)
280 (timer-inc-time timer (aref timer 4) 0) 308 (timer-inc-time timer (aref timer 4) 0)
281 ;; If real time has jumped forward, 309 ;; If real time has jumped forward,
282 ;; perhaps because Emacs was suspended for a long time, 310 ;; perhaps because Emacs was suspended for a long time,
@@ -287,7 +315,7 @@ This function is called, by name, directly by the C code."
287 (aref timer 4)))) 315 (aref timer 4))))
288 (if (> repeats timer-max-repeats) 316 (if (> repeats timer-max-repeats)
289 (timer-inc-time timer (* (aref timer 4) repeats))))) 317 (timer-inc-time timer (* (aref timer 4) repeats)))))
290 (timer-activate timer t) 318 (timer-activate timer t cell)
291 (setq retrigger t))) 319 (setq retrigger t)))
292 ;; Run handler. 320 ;; Run handler.
293 ;; We do this after rescheduling so that the handler function 321 ;; We do this after rescheduling so that the handler function