From: "Ludovic Courtès" <ludo@gnu.org>
To: Mathieu Othacehe <othacehe@gnu.org>
Cc: 41948@debbugs.gnu.org
Subject: bug#41948: Shepherd deadlocks
Date: Sat, 08 May 2021 00:07:20 +0200 [thread overview]
Message-ID: <87o8dm9p0n.fsf@gnu.org> (raw)
In-Reply-To: <87v97u9pu1.fsf@gnu.org> ("Ludovic Courtès"'s message of "Fri, 07 May 2021 23:49:42 +0200")
[-- Attachment #1: Type: text/plain, Size: 420 bytes --]
Ludovic Courtès <ludo@gnu.org> skribis:
> While working on a fix for this issue (finalizer pipe shared between
> parent and child process), I found the ‘sleep_pipe’ of the main thread
> is also shared between the parent and its child.
Here’s a patch that fixes the problem as exposed by the reproducer.
Thoughts?
(We’d need these pipes to be “O_CLOFORK” rather than O_CLOEXEC.)
Ludo’.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 1207 bytes --]
diff --git a/libguile/posix.c b/libguile/posix.c
index eaf12de32..e0c157c20 100644
--- a/libguile/posix.c
+++ b/libguile/posix.c
@@ -1217,6 +1217,29 @@ SCM_DEFINE (scm_execle, "execle", 2, 0, 1,
#undef FUNC_NAME
#ifdef HAVE_FORK
+static void *
+do_fork (void *ret)
+{
+ pid_t pid = fork ();
+
+ if (pid == 0)
+ {
+ /* The child process must not share its sleep pipe with the
+ parent. */
+ int err;
+ scm_thread *t = SCM_I_CURRENT_THREAD;
+
+ close (t->sleep_pipe[0]);
+ close (t->sleep_pipe[1]);
+ err = pipe2 (t->sleep_pipe, O_CLOEXEC);
+ if (err != 0)
+ abort ();
+ }
+
+ * (pid_t *) ret = pid;
+ return NULL;
+}
+
SCM_DEFINE (scm_fork, "primitive-fork", 0, 0, 0,
(),
"Creates a new \"child\" process by duplicating the current \"parent\" process.\n"
@@ -1244,7 +1267,9 @@ SCM_DEFINE (scm_fork, "primitive-fork", 0, 0, 0,
" further behavior unspecified. See \"Processes\" in the\n"
" manual, for more information.\n"),
scm_current_warning_port ());
- pid = fork ();
+
+ scm_without_guile (do_fork, &pid);
+
if (pid == -1)
SCM_SYSERROR;
return scm_from_int (pid);
next prev parent reply other threads:[~2021-05-07 22:08 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-19 8:41 bug#41948: Shepherd deadlocks Mathieu Othacehe
2020-06-19 12:10 ` Mathieu Othacehe
2020-06-20 0:16 ` Michael Rohleder
2020-06-20 10:31 ` Ludovic Courtès
2020-08-16 9:56 ` Mathieu Othacehe
2021-05-07 21:49 ` Ludovic Courtès
2021-05-07 22:07 ` Ludovic Courtès [this message]
2021-05-08 20:52 ` Ludovic Courtès
2021-05-08 9:43 ` Ludovic Courtès
2021-05-08 13:49 ` Andrew Whatson
2021-05-08 13:49 ` bug#41948: [PATCH] Fix some finalizer thread race conditions Andrew Whatson
2021-05-08 20:50 ` bug#41948: Shepherd deadlocks Ludovic Courtès
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=87o8dm9p0n.fsf@gnu.org \
--to=ludo@gnu.org \
--cc=41948@debbugs.gnu.org \
--cc=othacehe@gnu.org \
/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/guix.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.