Subject: bug#46494: 28.0.50; [native-comp] Problems with async background compile

From: Eli Zaretskii <[email-masked]>
Date: Sat, 20 Feb 2021 12:37:43 +0200

> From: Andrea Corallo <[email-masked]>
> Cc: [email-masked], [email-masked]
> Date: Sun, 14 Feb 2021 18:28:02 +0000
> 
> >> > c) Quitting emacs when async compilation processes are running sometimes
> >> >    causes crashes in the compile processes, which show the emacs abort
> >> >    dialog (once for each async process). The dialogs disappear after a
> >> >    short delay (presumably due to the parent emacs having exited).
> >> 
> >> Mmmh, I guess this is a Windows specific behavior.  Is there a specific
> >> way to shut-down child processes we would use on Windows not to get
> >> this error?
> >
> > Andrea, can you point me to the place where we interrupt async
> > compilations when Emacs exits?  Is that just a normal delete-process,
> > or do we do something else, like sending a signal?  Also, does the
> > Emacs subprocess invoked to perform async compilation spawn further
> > child processes, or is everything happening inside a single Emacs
> > process?
> 
> Hi Eli,
> 
> we have no special handling for closing async compilation processes,
> they should be closed as all child processes started by Emacs are.
> 
> In the child process we do not spawn directly any other process, but
> libgccjit might do it (ex to call gas).

OK, I've reviewed the code which kills subprocesses when Emacs is shut
down, and I have some questions:

  . How does libgccjit handle the case that its process is exiting?
    Does it have any atexit handlers or static destructors?  IOW, how
    does it ensure its own subprocesses, like gas etc. are terminated?

  . When we invoke Emacs in a subprocess to do the async compilation,
    do we specify that it should be killed without query?  I don't see
    this in the code (did I miss it?), but if we don't, then exiting
    Emacs will ask the user whether to kill the subprocesses -- does
    it?

Andy, if instead if exiting Emacs, you use signal-process, like this:

  M-: (signal-process PROC-ID 'SIGHUP) RET

(where PROC-ID is the process ID of the Emacs subprocess running the
native compilation), do you see the same crash, or does the subprocess
exit cleanly?  To see the PROC-ID, you can use the Task manager or the
'pslist' command from the PsTools suite.

Thanks.

P.S. Andrea, I see you use "path" in comp.el (and perhaps elsewhere)
to mean "file name", but the GNU Coding Standards frown on using this
for anything other than PATH-style directory lists.  So this should at
some point be replaced with "file name".