* When are unused overlays garbage collected?
@ 2021-05-24 5:00 Marcin Borkowski
2021-05-24 5:05 ` Emanuel Berg via Users list for the GNU Emacs text editor
` (2 more replies)
0 siblings, 3 replies; 19+ messages in thread
From: Marcin Borkowski @ 2021-05-24 5:00 UTC (permalink / raw)
To: Help Gnu Emacs mailing list
Hi all,
the Elisp reference says that the `delete-overlay' function does not
entirely delete the overlay (in a sense):
--8<---------------cut here---------------start------------->8---
The overlay continues to exist as a Lisp object, and its property list
is unchanged, but it ceases to be attached to the buffer it belonged to,
and ceases to have any effect on display.
A deleted overlay is not permanently disconnected. You can give it
a position in a buffer again by calling ‘move-overlay’.
--8<---------------cut here---------------end--------------->8---
So I assume that if I `delete-overlay', it means it cannot be
necessarily garbage-collected yet. So, when /can/ an overlay be really
"deleted", meaning the memory it occupied is freed?
My guess would be that if the overlay is "deleted" (so it is not
attached to any buffer, either by means of `delete-overlay' or when its
buffer is killed) /and/ it can't be referenced from Elisp (e.g., there
is no variable bound to it). This would make sense, because even if
there is no variable bound to an overlay which is not deleted, you can
still get a reference to it using any of the overlay-finding functions
(`overlays-at' or `overlays-in').
Am I correct?
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-24 5:00 When are unused overlays garbage collected? Marcin Borkowski
@ 2021-05-24 5:05 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-05-24 6:33 ` Marcin Borkowski
2021-05-24 12:27 ` Eli Zaretskii
2021-05-24 17:07 ` Stefan Monnier via Users list for the GNU Emacs text editor
2 siblings, 1 reply; 19+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-05-24 5:05 UTC (permalink / raw)
To: help-gnu-emacs
Marcin Borkowski wrote:
> So I assume that if I `delete-overlay', it means it cannot
> be necessarily garbage-collected yet. So, when /can/ an
> overlay be really "deleted", meaning the memory it occupied
> is freed?
(setq inhibit-default-init t)
(setq garbage-collection-messages nil)
(setq gc-cons-threshold 3000000)
--
underground experts united
https://dataswamp.org/~incal
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-24 5:05 ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-05-24 6:33 ` Marcin Borkowski
0 siblings, 0 replies; 19+ messages in thread
From: Marcin Borkowski @ 2021-05-24 6:33 UTC (permalink / raw)
To: Emanuel Berg; +Cc: help-gnu-emacs
On 2021-05-24, at 07:05, Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> wrote:
> Marcin Borkowski wrote:
>
>> So I assume that if I `delete-overlay', it means it cannot
>> be necessarily garbage-collected yet. So, when /can/ an
>> overlay be really "deleted", meaning the memory it occupied
>> is freed?
>
> (setq inhibit-default-init t)
> (setq garbage-collection-messages nil)
> (setq gc-cons-threshold 3000000)
How is that supposed to help me?
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-24 5:00 When are unused overlays garbage collected? Marcin Borkowski
2021-05-24 5:05 ` Emanuel Berg via Users list for the GNU Emacs text editor
@ 2021-05-24 12:27 ` Eli Zaretskii
2021-05-26 4:53 ` Marcin Borkowski
2021-05-24 17:07 ` Stefan Monnier via Users list for the GNU Emacs text editor
2 siblings, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2021-05-24 12:27 UTC (permalink / raw)
To: help-gnu-emacs
> From: Marcin Borkowski <mbork@mbork.pl>
> Date: Mon, 24 May 2021 07:00:54 +0200
>
> --8<---------------cut here---------------start------------->8---
> The overlay continues to exist as a Lisp object, and its property list
> is unchanged, but it ceases to be attached to the buffer it belonged to,
> and ceases to have any effect on display.
>
> A deleted overlay is not permanently disconnected. You can give it
> a position in a buffer again by calling ‘move-overlay’.
> --8<---------------cut here---------------end--------------->8---
>
> So I assume that if I `delete-overlay', it means it cannot be
> necessarily garbage-collected yet.
Yes, it _can_ be GCed right away, at least in principle. But Emacs
will not necessarily trigger GC right away, so the overlay will not
necessarily be collected immediately, even if it isn't references from
any other variable or structure anymore.
> My guess would be that if the overlay is "deleted" (so it is not
> attached to any buffer, either by means of `delete-overlay' or when its
> buffer is killed) /and/ it can't be referenced from Elisp (e.g., there
> is no variable bound to it).
That's not entirely true. An overlay (like any other Lisp object)
that was deleted will not be collected as long as some variable
_actually_references_ it. That could be a Lisp variable or a C
variable not exposed to Lisp. The difference between what I wrote and
what you wrote is that the reference must actually exist, not only be
possible.
> This would make sense, because even if there is no variable bound to
> an overlay which is not deleted, you can still get a reference to it
> using any of the overlay-finding functions (`overlays-at' or
> `overlays-in').
No, overlays-in and overlays-at will not find a deleted overlay.
These functions walk the buffer's overlay list, and a deleted overlay
is unlinked from that list.
Does that answer your questions? (I'm not sure what is exactly your
question, because you didn't describe the context in which this issue
bothered you.)
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-24 5:00 When are unused overlays garbage collected? Marcin Borkowski
2021-05-24 5:05 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-05-24 12:27 ` Eli Zaretskii
@ 2021-05-24 17:07 ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-05-26 5:01 ` Marcin Borkowski
2 siblings, 1 reply; 19+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-05-24 17:07 UTC (permalink / raw)
To: help-gnu-emacs
> My guess would be that if the overlay is "deleted" (so it is not
> attached to any buffer, either by means of `delete-overlay' or when its
> buffer is killed) /and/ it can't be referenced from Elisp (e.g., there
> is no variable bound to it). This would make sense, because even if
> there is no variable bound to an overlay which is not deleted, you can
> still get a reference to it using any of the overlay-finding functions
> (`overlays-at' or `overlays-in').
Sounds right, yes. `delete-overlay` just disconnects the overlay from
the buffer in which it was placed. As long as an overlay is placed in
a buffer, then it is still reachable (via internal variables inside the
buffer, and via `overlays-at' or `overlays-in') and it can have visible
effects on screen.
Markers share some of their implementation with overlays, but because
markers do not affect the display and because there is nothing
corresponding to `overlays-at' or `overlays-in', Emacs goes through the
trouble of GC'ing those markers which are still reachable via the
buffer's internal variables (its list of markers) as long as they're not
reachable some other way, of course.
So it's OK to create markers are then forget about them, but it's not
OK to create overlays and then forget about them: you need to manually
`delete-overlay` when you're done with them otherwise they'll accumulate
in the buffer.
Stefan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-24 12:27 ` Eli Zaretskii
@ 2021-05-26 4:53 ` Marcin Borkowski
2021-05-26 7:23 ` tomas
2021-05-26 12:30 ` Eli Zaretskii
0 siblings, 2 replies; 19+ messages in thread
From: Marcin Borkowski @ 2021-05-26 4:53 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: help-gnu-emacs
On 2021-05-24, at 14:27, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Marcin Borkowski <mbork@mbork.pl>
>> Date: Mon, 24 May 2021 07:00:54 +0200
>>
>> --8<---------------cut here---------------start------------->8---
>> The overlay continues to exist as a Lisp object, and its property list
>> is unchanged, but it ceases to be attached to the buffer it belonged to,
>> and ceases to have any effect on display.
>>
>> A deleted overlay is not permanently disconnected. You can give it
>> a position in a buffer again by calling ‘move-overlay’.
>> --8<---------------cut here---------------end--------------->8---
>>
>> So I assume that if I `delete-overlay', it means it cannot be
>> necessarily garbage-collected yet.
>
> Yes, it _can_ be GCed right away, at least in principle. But Emacs
> will not necessarily trigger GC right away, so the overlay will not
> necessarily be collected immediately, even if it isn't references from
> any other variable or structure anymore.
I realize that GC might not trigger immediately, of course.
But what would happen if I (delete-overlay my-overlay), then it gets
garbage collected, and then I (move-overlay my-overlay ...)?
I just performed a simple experiment - I manually created an overlay in
a temporary buffer, bound a variable to it, deleted it, and called
(garbage-collect) - and C-h v'ing that variable still said:
aqq’s value is #<overlay in no buffer>
so I assume it was /not/ GCed.
>> My guess would be that if the overlay is "deleted" (so it is not
>> attached to any buffer, either by means of `delete-overlay' or when its
>> buffer is killed) /and/ it can't be referenced from Elisp (e.g., there
>> is no variable bound to it).
>
> That's not entirely true. An overlay (like any other Lisp object)
> that was deleted will not be collected as long as some variable
> _actually_references_ it. That could be a Lisp variable or a C
> variable not exposed to Lisp. The difference between what I wrote and
> what you wrote is that the reference must actually exist, not only be
> possible.
I am not sure if I grasp that difference. Can you provide an example of
a situation when an object does not have an "actual reference" but still
"can be referenced"? Do you mean e.g. it being an element of a list
bound to some variable?
>> This would make sense, because even if there is no variable bound to
>> an overlay which is not deleted, you can still get a reference to it
>> using any of the overlay-finding functions (`overlays-at' or
>> `overlays-in').
>
> No, overlays-in and overlays-at will not find a deleted overlay.
> These functions walk the buffer's overlay list, and a deleted overlay
> is unlinked from that list.
Well, I meant something different - an overlay that is "live" in some
buffer, but no variable is bound to it. Such an overlay /can/ be
referenced with `overlays-in' / `overlays-at', so obviously cannot be
GCed, right?
> Does that answer your questions? (I'm not sure what is exactly your
> question, because you didn't describe the context in which this issue
> bothered you.)
Well, this is one of the many questions that I wanted to have answered
for myself while writing my Emacs Lisp book (which I'm not sure I'm
allowed to talk about here) - just so that I have a better understanding
of overlays (note that I've been using them in my code for quite some
time - it turns out that only after you try to explain something, you
start to understand it better/appreciate it more/realize you didn't
understand it really well...).
Best,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-24 17:07 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2021-05-26 5:01 ` Marcin Borkowski
2021-05-26 12:34 ` Eli Zaretskii
2021-05-26 14:48 ` Stefan Monnier
0 siblings, 2 replies; 19+ messages in thread
From: Marcin Borkowski @ 2021-05-26 5:01 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
On 2021-05-24, at 19:07, Stefan Monnier via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> wrote:
>> My guess would be that if the overlay is "deleted" (so it is not
>> attached to any buffer, either by means of `delete-overlay' or when its
>> buffer is killed) /and/ it can't be referenced from Elisp (e.g., there
>> is no variable bound to it). This would make sense, because even if
>> there is no variable bound to an overlay which is not deleted, you can
>> still get a reference to it using any of the overlay-finding functions
>> (`overlays-at' or `overlays-in').
>
> Sounds right, yes. `delete-overlay` just disconnects the overlay from
> the buffer in which it was placed. As long as an overlay is placed in
> a buffer, then it is still reachable (via internal variables inside the
> buffer, and via `overlays-at' or `overlays-in') and it can have visible
> effects on screen.
Thanks!
> Markers share some of their implementation with overlays, but because
> markers do not affect the display and because there is nothing
> corresponding to `overlays-at' or `overlays-in', Emacs goes through the
> trouble of GC'ing those markers which are still reachable via the
> buffer's internal variables (its list of markers) as long as they're not
> reachable some other way, of course.
Thanks, too, this is pretty interesting. I assume one possible reason
for not having `markers-in' (analogous to `overlays-in') is that an
overlay (even without any variable pointing to it, IOW, a "name" for it)
has some "semantics" (properties), so it can be "guessed" what it is
for; for markers, we would only know that "someone wanted to remember
this position, but we have no idea why/what for", so why even bother
keeping it? (Technically, there is also the insertion type, but that
doesn't tell much, either.)
> So it's OK to create markers are then forget about them, but it's not
> OK to create overlays and then forget about them: you need to manually
> `delete-overlay` when you're done with them otherwise they'll accumulate
> in the buffer.
And that is probably the most important takeaway here - but it raises
another question. If I create an overlay in some buffer, keep no
references to it, and then kill the buffer - is the overlay eligible for
GC? (Again, I performed an experiment, and the results suggest that its
state is similar to what happen after `delete-overlay', so I assume
yes.)
TIA,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 4:53 ` Marcin Borkowski
@ 2021-05-26 7:23 ` tomas
2021-05-26 15:36 ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-05-26 12:30 ` Eli Zaretskii
1 sibling, 1 reply; 19+ messages in thread
From: tomas @ 2021-05-26 7:23 UTC (permalink / raw)
To: help-gnu-emacs
[-- Attachment #1: Type: text/plain, Size: 1082 bytes --]
On Wed, May 26, 2021 at 06:53:42AM +0200, Marcin Borkowski wrote:
>
> On 2021-05-24, at 14:27, Eli Zaretskii <eliz@gnu.org> wrote:
>
> >> From: Marcin Borkowski <mbork@mbork.pl>
> >> Date: Mon, 24 May 2021 07:00:54 +0200
> >>
> >> --8<---------------cut here---------------start------------->8---
> >> The overlay continues to exist as a Lisp object, and its property list
> >> is unchanged, but it ceases to be attached to the buffer it belonged to,
> >> and ceases to have any effect on display.
> >>
> >> A deleted overlay is not permanently disconnected. You can give it
> >> a position in a buffer again by calling ‘move-overlay’.
[...]
> But what would happen if I (delete-overlay my-overlay), then it gets
> garbage collected, and then I (move-overlay my-overlay ...)?
^^^^^^^^^^
You are still holding a reference to it. It would be an extremely
impolite action on part of the garbage collector to even look at
your overlay. I'm sure it would bring about a severe reprimand :)
Cheers
- t
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 4:53 ` Marcin Borkowski
2021-05-26 7:23 ` tomas
@ 2021-05-26 12:30 ` Eli Zaretskii
2021-05-27 16:20 ` Marcin Borkowski
1 sibling, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2021-05-26 12:30 UTC (permalink / raw)
To: help-gnu-emacs
> From: Marcin Borkowski <mbork@mbork.pl>
> Cc: help-gnu-emacs@gnu.org
> Date: Wed, 26 May 2021 06:53:42 +0200
>
> But what would happen if I (delete-overlay my-overlay), then it gets
> garbage collected, and then I (move-overlay my-overlay ...)?
>
> I just performed a simple experiment - I manually created an overlay in
> a temporary buffer, bound a variable to it, deleted it, and called
> (garbage-collect) - and C-h v'ing that variable still said:
>
> aqq’s value is #<overlay in no buffer>
>
> so I assume it was /not/ GCed.
It wasn't GCed because it was referenced from a variable.
> >> My guess would be that if the overlay is "deleted" (so it is not
> >> attached to any buffer, either by means of `delete-overlay' or when its
> >> buffer is killed) /and/ it can't be referenced from Elisp (e.g., there
> >> is no variable bound to it).
> >
> > That's not entirely true. An overlay (like any other Lisp object)
> > that was deleted will not be collected as long as some variable
> > _actually_references_ it. That could be a Lisp variable or a C
> > variable not exposed to Lisp. The difference between what I wrote and
> > what you wrote is that the reference must actually exist, not only be
> > possible.
>
> I am not sure if I grasp that difference. Can you provide an example of
> a situation when an object does not have an "actual reference" but still
> "can be referenced"? Do you mean e.g. it being an element of a list
> bound to some variable?
No, that's not the essence of the difference. You said, above, "it
can't be referenced from Lisp". My point is that "can't" doesn't cut
it, because an object can be GCed even if it _can_ be referenced.
What matters is that it _is_not_ referenced, even though it _can_be_.
IOW, any object can potentially be referenced by some variable, but GC
only avoids recycling an object if some other object actually (not
potentially) references it. The GC's "mark" phase scans all the live
Lisp objects and marks any other objects referenced by those live
objects, recursively. Any marked object will not be recycled by the
"sweep" phase.
> Well, I meant something different - an overlay that is "live" in some
> buffer, but no variable is bound to it. Such an overlay /can/ be
> referenced with `overlays-in' / `overlays-at', so obviously cannot be
> GCed, right?
No live overlay in a live buffer will ever be GCed, because when GC
marks live buffers, it also marks the overlays in that buffer by
walking the linked list of the buffer's overlays.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 5:01 ` Marcin Borkowski
@ 2021-05-26 12:34 ` Eli Zaretskii
2021-05-27 16:23 ` Marcin Borkowski
2021-05-26 14:48 ` Stefan Monnier
1 sibling, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2021-05-26 12:34 UTC (permalink / raw)
To: help-gnu-emacs
> From: Marcin Borkowski <mbork@mbork.pl>
> Date: Wed, 26 May 2021 07:01:48 +0200
> Cc: help-gnu-emacs@gnu.org
>
> > Markers share some of their implementation with overlays, but because
> > markers do not affect the display and because there is nothing
> > corresponding to `overlays-at' or `overlays-in', Emacs goes through the
> > trouble of GC'ing those markers which are still reachable via the
> > buffer's internal variables (its list of markers) as long as they're not
> > reachable some other way, of course.
>
> Thanks, too, this is pretty interesting. I assume one possible reason
> for not having `markers-in' (analogous to `overlays-in') is that an
> overlay (even without any variable pointing to it, IOW, a "name" for it)
> has some "semantics" (properties), so it can be "guessed" what it is
> for; for markers, we would only know that "someone wanted to remember
> this position, but we have no idea why/what for", so why even bother
> keeping it?
I think we don't have markers-in because it isn't needed. overlays-in
is needed when you want to find the next or the previous overlay, or
when you need to know what faces contribute to the appearance of a
character at certain position. There's no such need for markers.
> > So it's OK to create markers are then forget about them, but it's not
> > OK to create overlays and then forget about them: you need to manually
> > `delete-overlay` when you're done with them otherwise they'll accumulate
> > in the buffer.
>
> And that is probably the most important takeaway here - but it raises
> another question. If I create an overlay in some buffer, keep no
> references to it, and then kill the buffer - is the overlay eligible for
> GC?
Yes, killing a buffer deletes all of its overlays (and all of its
markers).
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 5:01 ` Marcin Borkowski
2021-05-26 12:34 ` Eli Zaretskii
@ 2021-05-26 14:48 ` Stefan Monnier
2021-05-27 16:26 ` Marcin Borkowski
1 sibling, 1 reply; 19+ messages in thread
From: Stefan Monnier @ 2021-05-26 14:48 UTC (permalink / raw)
To: Marcin Borkowski; +Cc: help-gnu-emacs
> Thanks, too, this is pretty interesting. I assume one possible reason
> for not having `markers-in' (analogous to `overlays-in') is that an
> overlay (even without any variable pointing to it, IOW, a "name" for it)
> has some "semantics" (properties), so it can be "guessed" what it is
> for; for markers, we would only know that "someone wanted to remember
> this position, but we have no idea why/what for", so why even bother
> keeping it? (Technically, there is also the insertion type, but that
> doesn't tell much, either.)
There's been proposals to add a `markers-in` function or
something similar. The main motivation was to better preserve some
marker's positions when replacing a chunk of text with another.
But the need is not very compelling, and there are some technical
issues, one of them being that internally overlays are contain two
markers, so this would risk exposing those markers, making it possible
for an overlay to have a start and an end in two different buffers.
None of this is terribly difficult to solve, but compared to the
usefulness it just doesn't seem worth the trouble.
>> So it's OK to create markers are then forget about them, but it's not
>> OK to create overlays and then forget about them: you need to manually
>> `delete-overlay` when you're done with them otherwise they'll accumulate
>> in the buffer.
>
> And that is probably the most important takeaway here - but it raises
> another question. If I create an overlay in some buffer, keep no
> references to it, and then kill the buffer - is the overlay eligible
> for GC?
Yes, of course, there's nothing very unusual going here, really: when an
overlay is placed in a buffer, it creates a reference from that buffer
to the overlay, so the overlay is reachable as long as the buffer itself
is reachable.
Stefan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 7:23 ` tomas
@ 2021-05-26 15:36 ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-05-26 16:52 ` tomas
0 siblings, 1 reply; 19+ messages in thread
From: Stefan Monnier via Users list for the GNU Emacs text editor @ 2021-05-26 15:36 UTC (permalink / raw)
To: help-gnu-emacs
>> But what would happen if I (delete-overlay my-overlay), then it gets
>> garbage collected, and then I (move-overlay my-overlay ...)?
> ^^^^^^^^^^
> You are still holding a reference to it. It would be an extremely
> impolite action on part of the garbage collector to even look at
> your overlay. I'm sure it would bring about a severe reprimand :)
Oh, the GC will definitely look at it, but it will be discrete, you
won't notice it.
Stefan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 15:36 ` Stefan Monnier via Users list for the GNU Emacs text editor
@ 2021-05-26 16:52 ` tomas
0 siblings, 0 replies; 19+ messages in thread
From: tomas @ 2021-05-26 16:52 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
[-- Attachment #1: Type: text/plain, Size: 325 bytes --]
On Wed, May 26, 2021 at 11:36:16AM -0400, Stefan Monnier via Users list for the GNU Emacs text editor wrote:
> > [...] even look at
> > your overlay. I'm sure it would bring about a severe reprimand :)
>
> Oh, the GC will definitely look at it, but it will be discrete, you
> won't notice it.
:-)
thanks
- t
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 12:30 ` Eli Zaretskii
@ 2021-05-27 16:20 ` Marcin Borkowski
2021-05-27 16:41 ` Eli Zaretskii
0 siblings, 1 reply; 19+ messages in thread
From: Marcin Borkowski @ 2021-05-27 16:20 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: help-gnu-emacs
On 2021-05-26, at 14:30, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Marcin Borkowski <mbork@mbork.pl>
>> Cc: help-gnu-emacs@gnu.org
>> Date: Wed, 26 May 2021 06:53:42 +0200
>>
>> But what would happen if I (delete-overlay my-overlay), then it gets
>> garbage collected, and then I (move-overlay my-overlay ...)?
>>
>> I just performed a simple experiment - I manually created an overlay in
>> a temporary buffer, bound a variable to it, deleted it, and called
>> (garbage-collect) - and C-h v'ing that variable still said:
>>
>> aqq’s value is #<overlay in no buffer>
>>
>> so I assume it was /not/ GCed.
>
> It wasn't GCed because it was referenced from a variable.
Stupid me, of course.
>> >> My guess would be that if the overlay is "deleted" (so it is not
>> >> attached to any buffer, either by means of `delete-overlay' or when its
>> >> buffer is killed) /and/ it can't be referenced from Elisp (e.g., there
>> >> is no variable bound to it).
>> >
>> > That's not entirely true. An overlay (like any other Lisp object)
>> > that was deleted will not be collected as long as some variable
>> > _actually_references_ it. That could be a Lisp variable or a C
>> > variable not exposed to Lisp. The difference between what I wrote and
>> > what you wrote is that the reference must actually exist, not only be
>> > possible.
>>
>> I am not sure if I grasp that difference. Can you provide an example of
>> a situation when an object does not have an "actual reference" but still
>> "can be referenced"? Do you mean e.g. it being an element of a list
>> bound to some variable?
>
> No, that's not the essence of the difference. You said, above, "it
> can't be referenced from Lisp". My point is that "can't" doesn't cut
> it, because an object can be GCed even if it _can_ be referenced.
> What matters is that it _is_not_ referenced, even though it _can_be_.
>
> IOW, any object can potentially be referenced by some variable, but GC
> only avoids recycling an object if some other object actually (not
> potentially) references it. The GC's "mark" phase scans all the live
> Lisp objects and marks any other objects referenced by those live
> objects, recursively. Any marked object will not be recycled by the
> "sweep" phase.
I think we misunderstood each other. By "can't be referenced from Lisp"
I meant "there was no object - like a variable - referencing it". IOW,
no possible Lisp code could get me a reference to that overlay. So we
agree, we just used words in a different way.
>> Well, I meant something different - an overlay that is "live" in some
>> buffer, but no variable is bound to it. Such an overlay /can/ be
>> referenced with `overlays-in' / `overlays-at', so obviously cannot be
>> GCed, right?
>
> No live overlay in a live buffer will ever be GCed, because when GC
> marks live buffers, it also marks the overlays in that buffer by
> walking the linked list of the buffer's overlays.
Yes, that was what I meant. Thanks.
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 12:34 ` Eli Zaretskii
@ 2021-05-27 16:23 ` Marcin Borkowski
0 siblings, 0 replies; 19+ messages in thread
From: Marcin Borkowski @ 2021-05-27 16:23 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: help-gnu-emacs
On 2021-05-26, at 14:34, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Marcin Borkowski <mbork@mbork.pl>
>> Date: Wed, 26 May 2021 07:01:48 +0200
>> Cc: help-gnu-emacs@gnu.org
>>
>> > Markers share some of their implementation with overlays, but because
>> > markers do not affect the display and because there is nothing
>> > corresponding to `overlays-at' or `overlays-in', Emacs goes through the
>> > trouble of GC'ing those markers which are still reachable via the
>> > buffer's internal variables (its list of markers) as long as they're not
>> > reachable some other way, of course.
>>
>> Thanks, too, this is pretty interesting. I assume one possible reason
>> for not having `markers-in' (analogous to `overlays-in') is that an
>> overlay (even without any variable pointing to it, IOW, a "name" for it)
>> has some "semantics" (properties), so it can be "guessed" what it is
>> for; for markers, we would only know that "someone wanted to remember
>> this position, but we have no idea why/what for", so why even bother
>> keeping it?
>
> I think we don't have markers-in because it isn't needed. overlays-in
> is needed when you want to find the next or the previous overlay, or
> when you need to know what faces contribute to the appearance of a
> character at certain position. There's no such need for markers.
Well, that obviously doesn't contradict what I was saying - but thanks
for the explanation (mine was of course just hypothesizing).
Best,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-26 14:48 ` Stefan Monnier
@ 2021-05-27 16:26 ` Marcin Borkowski
2021-05-27 21:42 ` Stefan Monnier
0 siblings, 1 reply; 19+ messages in thread
From: Marcin Borkowski @ 2021-05-27 16:26 UTC (permalink / raw)
To: Stefan Monnier; +Cc: help-gnu-emacs
On 2021-05-26, at 16:48, Stefan Monnier <monnier@iro.umontreal.ca> wrote:
>> Thanks, too, this is pretty interesting. I assume one possible reason
>> for not having `markers-in' (analogous to `overlays-in') is that an
>> overlay (even without any variable pointing to it, IOW, a "name" for it)
>> has some "semantics" (properties), so it can be "guessed" what it is
>> for; for markers, we would only know that "someone wanted to remember
>> this position, but we have no idea why/what for", so why even bother
>> keeping it? (Technically, there is also the insertion type, but that
>> doesn't tell much, either.)
>
> There's been proposals to add a `markers-in` function or
> something similar. The main motivation was to better preserve some
> marker's positions when replacing a chunk of text with another.
>
> But the need is not very compelling, and there are some technical
> issues, one of them being that internally overlays are contain two
> markers, so this would risk exposing those markers, making it possible
> for an overlay to have a start and an end in two different buffers.
> None of this is terribly difficult to solve, but compared to the
> usefulness it just doesn't seem worth the trouble.
I see.
>>> So it's OK to create markers are then forget about them, but it's not
>>> OK to create overlays and then forget about them: you need to manually
>>> `delete-overlay` when you're done with them otherwise they'll accumulate
>>> in the buffer.
>>
>> And that is probably the most important takeaway here - but it raises
>> another question. If I create an overlay in some buffer, keep no
>> references to it, and then kill the buffer - is the overlay eligible
>> for GC?
>
> Yes, of course, there's nothing very unusual going here, really: when an
> overlay is placed in a buffer, it creates a reference from that buffer
> to the overlay, so the overlay is reachable as long as the buffer itself
> is reachable.
Right, I didn't say that it's unusual - I only wanted to clarify that
I don't need to e.g. bother with `remove-overlays' before killing the
buffer (unless I keep a reference to some of them, of course).
Thanks,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-27 16:20 ` Marcin Borkowski
@ 2021-05-27 16:41 ` Eli Zaretskii
2021-05-28 19:38 ` Marcin Borkowski
0 siblings, 1 reply; 19+ messages in thread
From: Eli Zaretskii @ 2021-05-27 16:41 UTC (permalink / raw)
To: help-gnu-emacs
> From: Marcin Borkowski <mbork@mbork.pl>
> Cc: help-gnu-emacs@gnu.org
> Date: Thu, 27 May 2021 18:20:46 +0200
>
> I think we misunderstood each other. By "can't be referenced from Lisp"
> I meant "there was no object - like a variable - referencing it".
Well, "can't" means "cannot", not "doesn't".
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-27 16:26 ` Marcin Borkowski
@ 2021-05-27 21:42 ` Stefan Monnier
0 siblings, 0 replies; 19+ messages in thread
From: Stefan Monnier @ 2021-05-27 21:42 UTC (permalink / raw)
To: Marcin Borkowski; +Cc: help-gnu-emacs
> I only wanted to clarify that I don't need to e.g. bother with
> `remove-overlays' before killing the buffer.
Indeed, you doubly don't:
- when you kill a buffer, its overlays are automatically disconnected
from the buffer.
- even if `kill-buffer` were changed not to do that, when the buffer
is not reachable any more, the overlays to which it point would also
become GC'able (unless you keep a reference to them, of course).
Stefan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: When are unused overlays garbage collected?
2021-05-27 16:41 ` Eli Zaretskii
@ 2021-05-28 19:38 ` Marcin Borkowski
0 siblings, 0 replies; 19+ messages in thread
From: Marcin Borkowski @ 2021-05-28 19:38 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: help-gnu-emacs
On 2021-05-27, at 18:41, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Marcin Borkowski <mbork@mbork.pl>
>> Cc: help-gnu-emacs@gnu.org
>> Date: Thu, 27 May 2021 18:20:46 +0200
>>
>> I think we misunderstood each other. By "can't be referenced from Lisp"
>> I meant "there was no object - like a variable - referencing it".
>
> Well, "can't" means "cannot", not "doesn't".
Well, I'm not a native speaker of English - maybe that's why I didn't
understand you. My understanding of "can't" was more or less "the
programmer can't write any Lisp code to get the reference to it", and
I assume that you meant "there is no object attainable from Lisp code
referencing it" - so basically the same.
But let's not split that hair anymore. Anyway, thanks for you answers.
Best,
--
Marcin Borkowski
http://mbork.pl
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2021-05-28 19:38 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-05-24 5:00 When are unused overlays garbage collected? Marcin Borkowski
2021-05-24 5:05 ` Emanuel Berg via Users list for the GNU Emacs text editor
2021-05-24 6:33 ` Marcin Borkowski
2021-05-24 12:27 ` Eli Zaretskii
2021-05-26 4:53 ` Marcin Borkowski
2021-05-26 7:23 ` tomas
2021-05-26 15:36 ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-05-26 16:52 ` tomas
2021-05-26 12:30 ` Eli Zaretskii
2021-05-27 16:20 ` Marcin Borkowski
2021-05-27 16:41 ` Eli Zaretskii
2021-05-28 19:38 ` Marcin Borkowski
2021-05-24 17:07 ` Stefan Monnier via Users list for the GNU Emacs text editor
2021-05-26 5:01 ` Marcin Borkowski
2021-05-26 12:34 ` Eli Zaretskii
2021-05-27 16:23 ` Marcin Borkowski
2021-05-26 14:48 ` Stefan Monnier
2021-05-27 16:26 ` Marcin Borkowski
2021-05-27 21:42 ` Stefan Monnier
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).