From: Drew Adams <drew.adams@oracle.com>
To: Daniel Mendler <mail@daniel-mendler.de>,
"47992@debbugs.gnu.org" <47992@debbugs.gnu.org>
Cc: "monnier@iro.umontreal.ca" <monnier@iro.umontreal.ca>,
"jakanakaevangeli@chiru.no" <jakanakaevangeli@chiru.no>
Subject: bug#47992: [External] : bug#47992: 27; 28; Phase out use of `equal` in `add-hook`, `remove-hook`
Date: Sat, 24 Apr 2021 20:12:26 +0000 [thread overview]
Message-ID: <SA2PR10MB4474A35FF2DE9386A0F3F6E3F3449@SA2PR10MB4474.namprd10.prod.outlook.com> (raw)
In-Reply-To: <a9335e6c-e261-59a0-d59a-7dbb70d6dba6@daniel-mendler.de>
> (Follow-up to bug#46326 as suggested by Stefan Monnier)
>
> The functions `add/remove-hook` make use of `equal` to test equality of
> hooks. Using `equal` can lead to excessive memory allocations
> (bug#46326) or hangups (see comment in `set-transient-map`), when large
> closures or cyclic closures are used as hooks.
>
> Right now there are at least three places which have to work around the
> use of `equal` in `add/remove-hook` using a symbol indirection:
>
> * `set-transient-map`
> * `minibuffer-with-setup-hook`
> * `eval-after-load`
>
> It would be good to change `add/remove-hook` such that it only relies
> on `eq` to test hook equality. Then the symbol indirection workarounds
> can be avoided.
>
> However making such a change directly can lead to subtle breakage.
> Perhaps one could introduce some deprecation behavior first, before
> making the final change to `eq`. If a hook is added/removed and the
> added/removed object is not found via `eq` but found via `equal`, show
> a deprecation warning?
So instead of just advising users not to use lambda forms
(which makes sense), you'd make it no longer work at all
for interpreted lambda forms (except rare cases where
they might actually be `eq' - e.g., same list structure)?
Perhaps `equal' can be fixed to do something better with
closures? E.g., if the `eq' test in `equal' fails for a
closure arg then return nil? (I'm not proposing that.)
Either closure equality needs an `equal' comparison or it
doesn't, no? It sounds like the effect of what you're
suggesting would be for `eq' to be the closure equality
test - but only for `add|remove-hook' (?).
What's so wrong with the cases you mention using a symbol?
["work around the use of `equal` in `add/remove-hook`
using a symbol indirection"]
Isn't that, in effect, what all uses of `add|remove-hook'
would have to do after your proposal - either that or
make the use amenable to `eq' in some other way? (Does
byte-compilation of two structurally equivalent lambda
forms generally produce `eq' results?)
I'm no doubt missing something in the motivation for
this change. It sounds like sacrificing programmatic
flexibility for some performance optimization. Can you
elaborate on why this is needed (worth it)?
`set-transient-map' not being able to use `letrec',
because of the `add-hook' equality test, doesn't sound
like a good reason to change `add-hook'.
The point of `equal' is to test with `eq' first, then
if nil go beyond that to test for equal structure. Of
course, real functions don't have structure, and real
function equality is altogether problematic. But this
is Lisp, and some Lisp representations of "functions",
at least when interpreted, do have structure (list,
string, vector).
When I look at bug #46326, I see this wrt the problem
(motivation):
"The issue can be mitigated by using a modified version
of minibuffer-with-setup-hook, where I am creating a
symbol and fsetting instead of adding a lambda directly
via add-hook."
and
"It is the add-hook implementation or more precisely
the minibuffer-with-setup-hook implementation which
is responsible for the excessive allocations."
So it sounds like it's not really about `add-hook';
it's about `minibuffer-with-setup-hook'.
And it looks like your `m-w-s-h' replacement does
just what you'd require everything that uses
`add|remove-hook' to do: replace a lambda form by a
symbol (or equivalent workaround to get `eq'-ness).
You also say this in bug #46326, as possible
alternative remedies:
"1. Replace minibuffer-with-setup-hook with my version
if you think my version is better and an acceptable fix.
2. Investigate the reasons why add-hook with priorities
somehow copies large closures during sorting. This
is unacceptably costly."
And Stefan says, there:
"IOW I think the better fix is to change
`minibuffer-with-setup-hook` to use an indirection
via a symbol."
And that fix was already pushed. Why instead now
propose changing `add|remove-hook' to use only `eq'?
next prev parent reply other threads:[~2021-04-24 20:12 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-24 12:11 bug#47992: 27; 28; Phase out use of `equal` in `add-hook`, `remove-hook` Daniel Mendler
2021-04-24 20:12 ` Drew Adams [this message]
2021-04-24 20:23 ` bug#47992: [External] : " Daniel Mendler
2021-04-24 21:20 ` Drew Adams
2021-04-24 21:34 ` Daniel Mendler
2021-04-24 22:30 ` Stefan Monnier
2021-04-24 22:38 ` Daniel Mendler
2021-04-24 23:04 ` Stefan Monnier
2021-04-24 23:38 ` Daniel Mendler
2021-04-25 1:16 ` Drew Adams
2021-04-25 3:08 ` Stefan Monnier
2021-04-25 4:57 ` Drew Adams
2021-04-25 13:52 ` Stefan Monnier
2021-04-25 1:16 ` Drew Adams
2021-04-25 1:23 ` Drew Adams
2021-04-25 3:10 ` Stefan Monnier
2021-04-25 4:57 ` Drew Adams
2021-04-25 10:33 ` Daniel Mendler
2021-04-25 13:56 ` Stefan Monnier
2021-05-02 9:09 ` Lars Ingebrigtsen
2021-05-02 10:37 ` Daniel Mendler
2021-05-03 8:50 ` Lars Ingebrigtsen
2021-07-06 14:44 ` Olivier Certner
[not found] ` <877di6udfy.fsf@web.de>
2021-07-04 1:09 ` Lars Ingebrigtsen
2021-07-04 2:35 ` Michael Heerdegen
2021-07-04 2:56 ` Lars Ingebrigtsen
2021-07-04 4:28 ` Michael Heerdegen
2021-07-04 13:36 ` Lars Ingebrigtsen
2021-07-04 17:08 ` bug#47992: [External] : " Drew Adams
2021-07-04 22:45 ` Michael Heerdegen
2021-07-05 12:39 ` Lars Ingebrigtsen
2021-07-06 1:48 ` Richard Stallman
2021-07-06 2:37 ` bug#47992: [External] : " Drew Adams
2021-07-06 3:21 ` Michael Heerdegen
2021-07-07 23:57 ` Richard Stallman
2021-07-06 9:46 ` Arthur Miller
2021-07-07 23:57 ` Richard Stallman
2021-07-08 2:11 ` Arthur Miller
2021-07-04 23:15 ` Michael Heerdegen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=SA2PR10MB4474A35FF2DE9386A0F3F6E3F3449@SA2PR10MB4474.namprd10.prod.outlook.com \
--to=drew.adams@oracle.com \
--cc=47992@debbugs.gnu.org \
--cc=jakanakaevangeli@chiru.no \
--cc=mail@daniel-mendler.de \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.