Subject: Re: bug#17392: 24.3.90; cursor blinks faster and faster

From: Eli Zaretskii <[email-masked]>
Date: Sat, 10 May 2014 14:06:38 +0300

> From: Michael Heerdegen <[email-masked]>
> Date: Sat, 10 May 2014 12:34:09 +0200
> Cc: [email-masked]
> 
> In emacs -Q, I did
> 
> --8<---------------cut here---------------start------------->8---
> (progn
>   (advice-add 'timer-event-handler :before
>               (lambda (timer)
>                 (unless (or (memq timer timer-list)
>                             (memq timer timer-idle-list))
>                   (message "This should not happen"))))
>   (defun provoke (&rest _)
>     (run-with-idle-timer .001 nil
>                          (lambda () (sit-for 2.))))
>   (defadvice handle-switch-frame (after provoke activate)
>     (provoke)))
> --8<---------------cut here---------------end--------------->8---
> 
> After switching frames a bit, I get "This should not happen".  So an
> idle blinking timer not in timer-idle-list is called from C with
> timer-event-handler.  At this point, there is already another blinking
> timer in timer-idle-list.  timer-event-handler pushes the zombie timer
> to timer-idle-list as well, so then we have two of them there etc.

See how timers are run by keyboard.c: we first make a copy of the
timers' list, and then work on that copy.  The comment there says:

  /* We use copies of the timers' lists to allow a timer to add itself
     again, without locking up Emacs if the newly added timer is
     already ripe when added.  */

Can this implementation detail explain what you see?

Btw, I don't understand what you say here, it sounds a contradiction:

> So an idle blinking timer not in timer-idle-list is called from C
> with timer-event-handler.  At this point, there is already another
> blinking timer in timer-idle-list.

So is there a blinking time in timer-idle-list, or isn't there?  The
first sentence seems to say there isn't, but then the next sentence
says there is.