emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: undo-auto--undoable-change infloop


From: Madhu
Subject: Re: undo-auto--undoable-change infloop
Date: Wed, 21 Sep 2022 18:58:08 +0530

* Michael Heerdegen <87y1vwq0su.fsf @web.de> :
Wrote on Wed, 10 Aug 2022 04:39:45 +0200:

> Stefan Monnier <monnier @iro.umontreal.ca> writes:
>
>> But I think you can `cancel-timer` before `timer-activate`, which will
>> make sure it's not in the list any more.
>
> That solution also came to my mind.  Wastes a lot of time, though.  The
> `timer-list' is traversed 3 times: First, to find the timer to delete
> it, second to test if it's already present when trying to add it (your
> change), third, to sort it in at the right position (though I don't
> understand why that is necessary).  The list is probably never that
> large so that it would matter much.

I didn't spot a bug report but I see this commit:

* commit eb7fe81e6db8d630521098a728713e10c9d59c74
|Author:     Stefan Monnier <monnier@iro.umontreal.ca>
|AuthorDate: Fri Aug 5 10:38:59 2022 -0400
|Commit:     Stefan Monnier <monnier@iro.umontreal.ca>
|CommitDate: Fri Aug 5 10:38:59 2022 -0400
|
|    timer.el: Avoid repeated timers
|
|    https://mail.gnu.org/archive/html/emacs-devel/2022-07/msg01127.html
|    points out that end-users can get bitten by this, accidentally
|    calling `timer-activate` on an already activated timer.
|
|    * lisp/emacs-lisp/timer.el (timer--activate): Signal an error if we try
|    to re-add a timer that's already on the timer-list.

FYI

I thought I had a valid use case for calling timer--activate on an
already active timer.

```
(defvar $jps-reader-reset-interval 10)

(defvar $current-search-timer
  (run-with-timer $jps-reader-reset-interval nil
                  (lambda ()
                    (let ((orig $current-search-string))
                      (setq $current-search-string "")
                      (let (message-log-max)
                        (message "timer: reset %s to %s" orig
                                 $current-search-string))))))

(defun respool ()
  (progn
    ;;(find $current-search-timer timer-list)
    (setf (timer--time $current-search-timer)
          (time-add (seconds-to-time jps-reader-reset-interval) (current-time)))
     (timer-activate $current-search-timer)))
```

The idea was to handle a "mode" where keystrokes would enter characters
in a "search string". the "mode" would timeout after a 10 seconds. If a
new character of the "search string" is read within the timeout period,
the timer is renewed ("respooled"). If a non "search string" character
is read, then the timer is cancelled and the "mode" exits.

After this commit the last line of respool has to look like

(timer-activate $current-search-timer nil (cancel-timer-internal
  $current-search-timer))


Which uses an internal function, but I thought my timer-activate was
legitimate to extend the timer.  Maybe I should have approached the
problem differently?




reply via email to

[Prev in Thread] Current Thread [Next in Thread]