* lisp/emacs-lisp/timer.el (timer-event-handler): Don't run if canceled.
Fixes: debbugs:17392
This commit is contained in:
parent
2f82660963
commit
08a2434e2f
4 changed files with 52 additions and 40 deletions
|
@ -1,3 +1,8 @@
|
|||
2014-05-18 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* emacs-lisp/timer.el (timer-event-handler): Don't run if canceled
|
||||
(bug#17392).
|
||||
|
||||
2014-05-17 Michael Albinus <michael.albinus@gmx.de>
|
||||
|
||||
* net/tramp-sh.el (tramp-find-inline-encoding): Do not match "%%t"
|
||||
|
|
|
@ -290,42 +290,50 @@ This function is called, by name, directly by the C code."
|
|||
(cell
|
||||
;; Delete from queue. Record the cons cell that was used.
|
||||
(cancel-timer-internal timer)))
|
||||
;; Re-schedule if requested.
|
||||
(if (timer--repeat-delay timer)
|
||||
(if (timer--idle-delay timer)
|
||||
(timer-activate-when-idle timer nil cell)
|
||||
(timer-inc-time timer (timer--repeat-delay timer) 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))
|
||||
(timer--repeat-delay timer))))
|
||||
(if (> repeats timer-max-repeats)
|
||||
(timer-inc-time timer (* (timer--repeat-delay timer)
|
||||
repeats)))))
|
||||
;; Place it back on the timer-list before running
|
||||
;; timer--function, so it can cancel-timer itself.
|
||||
(timer-activate timer t cell)
|
||||
(setq retrigger t)))
|
||||
;; Run handler.
|
||||
(condition-case-unless-debug err
|
||||
;; Timer functions should not change the current buffer.
|
||||
;; If they do, all kinds of nasty surprises can happen,
|
||||
;; and it can be hellish to track down their source.
|
||||
(save-current-buffer
|
||||
(apply (timer--function timer) (timer--args timer)))
|
||||
(error (message "Error running timer%s: %S"
|
||||
(if (symbolp (timer--function timer))
|
||||
(format " `%s'" (timer--function timer)) "")
|
||||
err)))
|
||||
(when (and retrigger
|
||||
;; If the timer's been canceled, don't "retrigger" it
|
||||
;; since it might still be in the copy of timer-list kept
|
||||
;; by keyboard.c:timer_check (bug#14156).
|
||||
(memq timer timer-list))
|
||||
(setf (timer--triggered timer) nil)))))
|
||||
;; If `cell' is nil, it means the timer was already canceled, so we
|
||||
;; shouldn't be running it at all. This can happen for example with the
|
||||
;; following scenario (bug#17392):
|
||||
;; - we run timers, starting with A (and remembering the rest as (B C)).
|
||||
;; - A runs and a does a sit-for.
|
||||
;; - during sit-for we run timer D which cancels timer B.
|
||||
;; - timer A finally finishes, so we move on to timers B and C.
|
||||
(unless cell
|
||||
;; Re-schedule if requested.
|
||||
(if (timer--repeat-delay timer)
|
||||
(if (timer--idle-delay timer)
|
||||
(timer-activate-when-idle timer nil cell)
|
||||
(timer-inc-time timer (timer--repeat-delay timer) 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))
|
||||
(timer--repeat-delay timer))))
|
||||
(if (> repeats timer-max-repeats)
|
||||
(timer-inc-time timer (* (timer--repeat-delay timer)
|
||||
repeats)))))
|
||||
;; Place it back on the timer-list before running
|
||||
;; timer--function, so it can cancel-timer itself.
|
||||
(timer-activate timer t cell)
|
||||
(setq retrigger t)))
|
||||
;; Run handler.
|
||||
(condition-case-unless-debug err
|
||||
;; Timer functions should not change the current buffer.
|
||||
;; If they do, all kinds of nasty surprises can happen,
|
||||
;; and it can be hellish to track down their source.
|
||||
(save-current-buffer
|
||||
(apply (timer--function timer) (timer--args timer)))
|
||||
(error (message "Error running timer%s: %S"
|
||||
(if (symbolp (timer--function timer))
|
||||
(format " `%s'" (timer--function timer)) "")
|
||||
err)))
|
||||
(when (and retrigger
|
||||
;; If the timer's been canceled, don't "retrigger" it
|
||||
;; since it might still be in the copy of timer-list kept
|
||||
;; by keyboard.c:timer_check (bug#14156).
|
||||
(memq timer timer-list))
|
||||
(setf (timer--triggered timer) nil))))))
|
||||
|
||||
;; This function is incompatible with the one in levents.el.
|
||||
(defun timeout-event-p (event)
|
||||
|
|
|
@ -1822,9 +1822,7 @@ terminals, cursor blinking is controlled by the terminal."
|
|||
:initialize 'custom-initialize-delay
|
||||
:group 'cursor
|
||||
:global t
|
||||
(if blink-cursor-idle-timer (cancel-timer blink-cursor-idle-timer))
|
||||
(setq blink-cursor-idle-timer nil)
|
||||
(blink-cursor-end)
|
||||
(blink-cursor-suspend)
|
||||
(remove-hook 'focus-in-hook #'blink-cursor-check)
|
||||
(remove-hook 'focus-out-hook #'blink-cursor-suspend)
|
||||
(when blink-cursor-mode
|
||||
|
|
|
@ -396,7 +396,8 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt,
|
|||
in previous recursive minibuffer, but was not set explicitly
|
||||
to t for this invocation, so set it to nil in this minibuffer.
|
||||
Save the old value now, before we change it. */
|
||||
specbind (intern ("minibuffer-completing-file-name"), Vminibuffer_completing_file_name);
|
||||
specbind (intern ("minibuffer-completing-file-name"),
|
||||
Vminibuffer_completing_file_name);
|
||||
if (EQ (Vminibuffer_completing_file_name, Qlambda))
|
||||
Vminibuffer_completing_file_name = Qnil;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue