[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?
- Re: undo-auto--undoable-change infloop,
Madhu <=