unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Pip Cet <pipcet@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: [EXPERIMENT] Emacs with the SpiderMonkey garbage collector
Date: Sat, 25 Nov 2017 23:50:16 +0000	[thread overview]
Message-ID: <CAOqdjBdNCg0zD_20sUKCHDiD2ZN2N0bbGSDqWh2orgY12AVVXA@mail.gmail.com> (raw)
In-Reply-To: <jwvzi7b9fab.fsf-monnier+gmane.emacs.devel@gnu.org>

On Sat, Nov 25, 2017 at 4:15 AM, Stefan Monnier
<monnier@iro.umontreal.ca> wrote:
>> We could, at some point in the future that's definitely not now, have
>> a flag day and run the preprocessor once[1] to disambiguate what are
>> currently Lisp_Objects by their uses, all typedef'd to Lisp_Object.
>
> IIUC by that you mean to somehow instrument all Lisp_Objects that are on
> the stack (and are currently traced via the conservative stack scanner),
> so that we can use a precise collector.

Yes, that is, I think, what I'm doing.

> This will only be acceptable if after the switch, invalid code
> (e.g. Lisp_Objects on the stack that aren't properly instrumented)
> is automatically detected.

Hmm. Is that for every build, or as a debugging option? Doing it for
every build is hard, doing it as a debug option should be possible:
after all, there'd be no more Lisp_Objects, just stack values, heap
values, and return values, which could use
__attribute__((constructor)) to check they are indeed on the heap,
stack, or that their __builtin_frame_address changes.

(I'm also treating pointers and arrays specially, but that's mere optimization.)

> After all, we used to have some of that info
> (i.e. we used to do precise stack scanning by manually
> registering/deregistering Lisp_Objects on the stack.  It wasn't precise
> enough for a moving GC, tho), but it was riddled with bugs because it
> was only maintained by hand.

You mean GCPRO? I'm not sure what you mean by "not precise enough"; I
briefly tried using the GCPRO information to keep track of stack
Lisp_Objects, but was defeated because some places didn't GCPRO
variables that they knew to be protected by upstream callers, as well
as the bugs.

>> Then switching garbage collectors becomes a matter of providing the
>> right header file rather than having to go through all the source
>> code, manually or with a converter. Again, there's no rush and no need
>> to do everything at once.
>
> No doubt, the GC can be changed.  There's been some attempts at using
> the Boehm GC to replace Emacs's current GC, for example.  It never went
> much further than an initial proof of concept, but I think it's pretty
> clear that it can be done.  It's less clear if it can bring very many
> benefits, OTOH (clearly a generational or a concurrent GC would be
> desirable in some corner cases, but nowadays the GC is rarely a source
> of complaints).

I guess I'm an exceptional user, then, because I complain about it a
lot. It's very much in embarrassing-pause territory here.

> Also I think a non-moving GC will be a lot easier to accommodate.

I suspect that I don't fully understand the benefits of a moving GC,
because memory fragmentation alone simply has never been a problem for
me.

I've compromised by, as I said, combining the disadvantages of both
approaches (though "disadvantages" can be read as "debugging
opportunities"): Lisp_Objects are JS::Values whose JS_GetPrivate
pointers are constant, even though the JS::Value isn't. So that's
essentially a non-moving GC with extra error checking (because even
Qnil can move (from one non-zero representation to another, too), and
has, which was a little confusing to debug).

> I'm not sure how your code deals with cases where we take a Lisp_Object
> and extract a C pointer from it which we keep long enough to survive
> a GC.

Right now, it doesn't, because the C pointer is constant. It should be
easy enough to convert, say, buffers and real vectors, because they
have accessor methods/macros. Frames would be a lot harder (but then
there are few enough of those that we can just accept they don't
move).

> Does your GC also trace through char* pointers into buffer text?

No.



  reply	other threads:[~2017-11-25 23:50 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-23 19:01 [EXPERIMENT] Emacs with the SpiderMonkey garbage collector Pip Cet
2017-11-24  8:07 ` Paul Eggert
2017-11-24 16:23   ` Pip Cet
2017-11-24 18:20     ` Paul Eggert
2017-11-24 23:27       ` Pip Cet
2017-11-25  0:21         ` Paul Eggert
2017-11-25 23:50           ` Pip Cet
2017-11-24 22:13 ` Stefan Monnier
2017-11-24 23:05   ` Pip Cet
2017-11-25  4:15     ` Stefan Monnier
2017-11-25 23:50       ` Pip Cet [this message]
2017-11-26  1:20         ` Stefan Monnier
2017-11-26  4:20           ` Paul Eggert
2017-11-26  5:11             ` Stefan Monnier
2017-11-26 10:27         ` martin rudalics
     [not found]         ` <jwva7z9rgqh.fsf&#45;monnier+Inbox@gnu.org>
     [not found]           ` <9d7be625&#45;85ae&#45;54d5&#45;3897&#45;6f701c8ea124@cs.ucla.edu>
     [not found]             ` <jwvo9npprfw.fsf&#45;monnier+emacs@gnu.org>
2017-12-01  1:03               ` Steve Fink
     [not found] <CAOqdjBe98BpWE&#45; Ey8fPY1DmfCiLYnB06d30Xqf_KMm_muvKbDg@mail.gmail.com>
2017-12-01 17:57 ` Steve Fink
2017-12-03  0:37   ` Pip Cet
2017-12-03  5:24     ` Steve Fink

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

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAOqdjBdNCg0zD_20sUKCHDiD2ZN2N0bbGSDqWh2orgY12AVVXA@mail.gmail.com \
    --to=pipcet@gmail.com \
    --cc=emacs-devel@gnu.org \
    --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 public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).