From: Derek Upham <sand@blarg.net>
To: Andy Wingo <wingo@pobox.com>
Cc: guile-devel@gnu.org
Subject: Re: Cygwin port of Guile 2.2
Date: Mon, 01 May 2017 13:48:13 -0700 [thread overview]
Message-ID: <87ziew4836.fsf@priss.frightenedpiglet.com> (raw)
In-Reply-To: <87ziffcbwg.fsf@priss.frightenedpiglet.com>
Derek Upham <sand@blarg.net> writes:
>> I think also that if you are most interested in a system in which
>> primitive-fork plays a large role, then probably you want a Guile
>> without threads (including the GC mark threads). Threads + fork is not
>> a recipe for success :)
>
> Understood. However, saying “primitive-fork requires a separate,
> threadless Guile installation” would be very limiting. I’d like to be
> in a position where Guile will manage any threads that it creates
> under the hood; then it’s up to the program owner to guarantee that
> there are no other threads running at fork time. Right now the
> under-the-hood threads appear to be:
>
> 1. The finalizer thread.
> 2. The signal delivery thread.
>
> (If you can think of any others, let me know.)
>
> For SCSH-style process forms, this comes up when trying to implement
> SCSH’s “early” child process auto-reap mechanism (section 3.4.1 in the
> SCSH manual). The “early” policy works by setting up a handler for
> SIGCHLD. We are guaranteed to have the signal delivery thread in that
> situation. (The “late” policy hooks into the garbage collector, so it
> avoids this problem; it can have pathological edge cases for
> long-running programs, however.)
It turns out that, in the current Guile implementation, the thread cleanup code has inherent race conditions. Running pthread_join() on a thread only guarantees that the thread has returned an exit value. It doesn’t say anything about whether the thread has finally terminnated (which for Guile means running the thread-local variable cleanup using on_thread_exit()). If there is a delay in running the thread-local variable cleanup (which happens occasionally), we end up forking a child that doesn’t run the thread-local variable cleanup. In that case, the child process never updates the global list of threads and doesn’t unregister the thread from the garbage collector.
In these sorts of situations, the standard operating procedure is to extract most of the on_thread_exit() code into its own function, which the parent can call synchronously before the fork. For safety when doing explicit cleanup, we would:
- Use the thread admin mutex to provide cross-thread protection.
- Use the thread struct “exited” field to prevent double-freeing.
(To make things more interesting, on_thread_exit() can end up shutting down the signal delivery thread. We will have to handle or avoid a recursive mutex lock.)
However, the on_thread_exit() function has the comment
/* This handler is executed in non-guile mode. */
at the top. Can someone explain what that means and what the implications are? How can I safely invoke the contained code from other contexts?
GDB also shows that Guile is spawning two threads at startup, and those don’t show up in the list of threads known to the system.
Thanks,
Derek
--
Derek Upham
sand@blarg.net
next prev parent reply other threads:[~2017-05-01 20:48 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-04 16:45 Cygwin port of Guile 2.2 Mike Gran
2017-04-04 17:03 ` Eli Zaretskii
2017-04-14 8:35 ` Andy Wingo
2017-04-14 13:41 ` Derek Upham
2017-04-17 8:04 ` Andy Wingo
2017-04-17 15:05 ` Derek Upham
2017-05-01 20:48 ` Derek Upham [this message]
2017-05-02 19:35 ` Andy Wingo
2017-05-03 3:18 ` Derek Upham
2017-05-03 9:24 ` Andy Wingo
2017-05-03 9:39 ` szgyg
2017-05-03 14:21 ` Derek Upham
2017-05-09 19:08 ` Andy Wingo
2017-05-12 14:13 ` Derek Upham
2017-05-15 20:06 ` Andy Wingo
2017-05-04 5:21 ` zv
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/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ziew4836.fsf@priss.frightenedpiglet.com \
--to=sand@blarg.net \
--cc=guile-devel@gnu.org \
--cc=wingo@pobox.com \
/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.
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).