diff options
| author | Richard M. Stallman | 2005-10-29 19:47:23 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 2005-10-29 19:47:23 +0000 |
| commit | dbbee529911e49ce1e3eda52632292e09e894f44 (patch) | |
| tree | 03a73fbf3313e366d12b14dbf124fa7f2865acf6 | |
| parent | 74614ac6c08f9baf1197e2431dc647c6df3dde7f (diff) | |
| download | emacs-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.el | 54 |
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 | |||
| 167 | REUSE-CELL, if non-nil, is a cons cell to reuse instead | ||
| 168 | of 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. |
| 194 | If optional argument DONT-WAIT is non-nil, then enable the | 202 | If optional argument DONT-WAIT is non-nil, then enable the |
| 195 | timer to activate immediately, or at the right time, if Emacs | 203 | timer to activate immediately, or at the right time, if Emacs |
| 196 | is already idle." | 204 | is already idle. |
| 205 | |||
| 206 | REUSE-CELL, if non-nil, is a cons cell to reuse instead | ||
| 207 | of 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 |