emacs-devel
[Top][All Lists]
Advanced

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

RE: Should `cancel-timer' use `delete' instead of `delq'?


From: Drew Adams
Subject: RE: Should `cancel-timer' use `delete' instead of `delq'?
Date: Wed, 6 Sep 2006 08:27:24 -0700

    > Well, I think that's exactly what I used in my defvar (after
    > having been bitten once), so I could henceforth re-eval it
    > ("abnormally") without worry or forethought. In any case, the
    > "traditional" way to do that is apparently to use
    > `define-minor-mode'...

    The traditional example I showed is not exempt from the OP.
    When you re-evaluate the defvar with C-M-x, the timer var is forcefully
    reset to nil, thus potentially forgetting a running timer, which then
    becomes again difficult to stop.

    Maybe you did realize that, but I got the feeling that you
    thought it didn't suffer from this problem.

I did realize that. I was attempting irony...

    And the same thing could/would happen if you use `timer-create'.
    The problem is not how you define/create your timer, but simply the fact
    that if you "forget" your timer object, it'll still be active as long as
    it's in the timer-list.

    One way to "solve" this problem is to change C-M-x so that in
    the case the variable's current value is a timer, it first cancels it,
    before resetting the var.  Similarly to my "recent" patch which cancels
    timers when unloading a package.

Yes. That's similar to what I proposed via a macro (to do the same thing).
If the first-cancel-then-define part is all that would be done, then your
suggestion is better. If more might be done (the activation and
toggle-command options I suggested), then a macro could be better.

Before this is laid to rest, let me request one more time that at least some
mention be made of this in the Elisp manual - in some form or other, whether
it's mentioned as a potential problem or whether some particular
practice/guideline is suggested/recommended.

If nothing else, it might be useful to point out that list `timer-idle-list'
is what controls whether an idle timer is active (similarly, `timer-list'),
so users will better understand that their defvar or whatever is not the
only pointer to the timer object. This may be obvious to some, but I'm sure
it is not obvious to some others.

IOW, even if `cancel-timer' needs to be handed a timer object (which you
might not have a handle for), you can always, as a last resort, delete your
timers by hand from `timer(-idle)-list', assuming that you can recognize
them (that is, you can reconstruct the list without them). Of course,
someone bitten by this pitfall and desperate to cancel timers will examine
the code of `cancel-timer' and find this out anyway, but foreknowledge of
this wouldn't hurt.






reply via email to

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