diff options
author | Karoly Lorentey <lorentey@elte.hu> | 2005-11-07 14:56:19 +0000 |
---|---|---|
committer | Karoly Lorentey <lorentey@elte.hu> | 2005-11-07 14:56:19 +0000 |
commit | 79c3172f78d56cf88c927fb0ff5c3b30fd676686 (patch) | |
tree | 20932caaa9695f3bb29b543f46107319a687308d /lisp/emacs-lisp/timer.el | |
parent | 9684e4c92f12f7c31f5e6fda7742960b403395f6 (diff) | |
parent | fab0d3087eb5215a5d08379ac765af27abc28842 (diff) | |
download | emacs-79c3172f78d56cf88c927fb0ff5c3b30fd676686.tar.gz emacs-79c3172f78d56cf88c927fb0ff5c3b30fd676686.tar.bz2 emacs-79c3172f78d56cf88c927fb0ff5c3b30fd676686.zip |
Merged from miles@gnu.org--gnu-2005 (patch 149-151, 629-641)
Patches applied:
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-629
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-630
Merge from gnus--rel--5.10
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-631
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-632
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-633
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-634
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-635
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-636
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-637
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-638
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-639
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-640
Update from CVS
* miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-641
Update from CVS
* miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-149
Merge from emacs--cvs-trunk--0
* miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-150
Update from CVS
* miles@gnu.org--gnu-2005/gnus--rel--5.10--patch-151
Update from CVS
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-437
Diffstat (limited to 'lisp/emacs-lisp/timer.el')
-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." (aset timer 6 args) timer) -(defun timer-activate (timer &optional triggered-p) - "Put TIMER on the list of active timers." +(defun timer-activate (timer &optional triggered-p reuse-cell) + "Put TIMER on the list of active timers. + +REUSE-CELL, if non-nil, is a cons cell to reuse instead +of allocating a new one." (if (and (timerp timer) (integerp (aref timer 1)) (integerp (aref timer 2)) @@ -180,20 +183,28 @@ fire repeatedly that many seconds apart." (> (aref timer 3) (aref (car timers) 3))))) (setq last timers timers (cdr timers))) + (if reuse-cell + (progn + (setcar reuse-cell timer) + (setcdr reuse-cell timers)) + (setq reuse-cell (cons timer timers))) ;; Insert new timer after last which possibly means in front of queue. (if last - (setcdr last (cons timer timers)) - (setq timer-list (cons timer timers))) + (setcdr last reuse-cell) + (setq timer-list reuse-cell)) (aset timer 0 triggered-p) (aset timer 7 nil) nil) (error "Invalid or uninitialized timer"))) -(defun timer-activate-when-idle (timer &optional dont-wait) +(defun timer-activate-when-idle (timer &optional dont-wait reuse-cell) "Arrange to activate TIMER whenever Emacs is next idle. If optional argument DONT-WAIT is non-nil, then enable the timer to activate immediately, or at the right time, if Emacs -is already idle." +is already idle. + +REUSE-CELL, if non-nil, is a cons cell to reuse instead +of allocating a new one." (if (and (timerp timer) (integerp (aref timer 1)) (integerp (aref timer 2)) @@ -211,10 +222,15 @@ is already idle." (> (aref timer 3) (aref (car timers) 3))))) (setq last timers timers (cdr timers))) + (if reuse-cell + (progn + (setcar reuse-cell timer) + (setcdr reuse-cell timers)) + (setq reuse-cell (cons timer timers))) ;; Insert new timer after last which possibly means in front of queue. (if last - (setcdr last (cons timer timers)) - (setq timer-idle-list (cons timer timers))) + (setcdr last reuse-cell) + (setq timer-idle-list reuse-cell)) (aset timer 0 (not dont-wait)) (aset timer 7 t) nil) @@ -231,6 +247,18 @@ is already idle." (setq timer-idle-list (delq timer timer-idle-list)) nil) +;; Remove TIMER from the list of active timers or idle timers. +;; Only to be used in this file. It returns the cons cell +;; that was removed from the list. +(defun cancel-timer-internal (timer) + (let ((cell1 (memq timer timer-list)) + (cell2 (memq timer timer-idle-list))) + (if cell1 + (setq timer-list (delq timer timer-list))) + (if cell2 + (setq timer-idle-list (delq timer timer-idle-list))) + (or cell1 cell2))) + ;;;###autoload (defun cancel-function-timers (function) "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." (setq timer-event-last timer) (let ((inhibit-quit t)) (if (timerp timer) - (let (retrigger) - ;; Delete from queue. - (cancel-timer timer) + (let (retrigger cell) + ;; Delete from queue. Record the cons cell that was used. + (setq cell (cancel-timer-internal timer)) ;; Re-schedule if requested. (if (aref timer 4) (if (aref timer 7) - (timer-activate-when-idle timer) + (timer-activate-when-idle timer nil cell) (timer-inc-time timer (aref timer 4) 0) ;; If real time has jumped forward, ;; perhaps because Emacs was suspended for a long time, @@ -287,7 +315,7 @@ This function is called, by name, directly by the C code." (aref timer 4)))) (if (> repeats timer-max-repeats) (timer-inc-time timer (* (aref timer 4) repeats))))) - (timer-activate timer t) + (timer-activate timer t cell) (setq retrigger t))) ;; Run handler. ;; We do this after rescheduling so that the handler function |