guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] GNU Guile branch, stable-2.0, updated. v2.0.7-34-ga796d0


From: Andy Wingo
Subject: [Guile-commits] GNU Guile branch, stable-2.0, updated. v2.0.7-34-ga796d0a
Date: Thu, 17 Jan 2013 11:39:38 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Guile".

http://git.savannah.gnu.org/cgit/guile.git/commit/?id=a796d0a95442b379a9ff2cdf9e0eb6efccc5dc08

The branch, stable-2.0 has been updated
       via  a796d0a95442b379a9ff2cdf9e0eb6efccc5dc08 (commit)
      from  36c210d14e8572939901b9251492a3f4bf94988c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit a796d0a95442b379a9ff2cdf9e0eb6efccc5dc08
Author: Andy Wingo <address@hidden>
Date:   Thu Jan 17 12:38:56 2013 +0100

    warn on multithreaded fork
    
    * libguile/posix.c (scm_fork): Issue a warning on a multithreaded fork.
    * doc/ref/posix.texi (Processes): Add note about multithreaded fork.
    
    * test-suite/tests/00-socket.test: Moved here, from socket.test, so as
      to run before any threads are created.
    * test-suite/Makefile.am: Adapt.

-----------------------------------------------------------------------

Summary of changes:
 doc/ref/posix.texi                               |   15 ++++++++++++++-
 libguile/posix.c                                 |   16 ++++++++++++++++
 test-suite/Makefile.am                           |    2 +-
 test-suite/tests/{socket.test => 00-socket.test} |    0
 4 files changed, 31 insertions(+), 2 deletions(-)
 rename test-suite/tests/{socket.test => 00-socket.test} (100%)

diff --git a/doc/ref/posix.texi b/doc/ref/posix.texi
index 0a688e9..18aadca 100644
--- a/doc/ref/posix.texi
+++ b/doc/ref/posix.texi
@@ -1,7 +1,7 @@
 @c -*-texinfo-*-
 @c This is part of the GNU Guile Reference Manual.
 @c Copyright (C)  1996, 1997, 2000, 2001, 2002, 2003, 2004, 2006, 2007,
address@hidden   2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
address@hidden   2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, 
Inc.
 @c See the file guile.texi for copying conditions.
 
 @node POSIX
@@ -1785,6 +1785,19 @@ Creates a new ``child'' process by duplicating the 
current ``parent'' process.
 In the child the return value is 0.  In the parent the return value is
 the integer process ID of the child.
 
+Note that it is unsafe to fork a process that has multiple threads
+running, as only the thread that calls @code{primitive-fork} will
+persist in the child.  Any resources that other threads held, such as
+locked mutexes or open file descriptors, are lost.  Indeed, @acronym{POSIX}
+specifies that only async-signal-safe procedures are safe to call after
+a multithreaded fork, which is a very limited set.  Guile issues a
+warning if it detects a fork from a multi-threaded program.
+
+If you are going to @code{exec} soon after forking, the procedures in
address@hidden(ice-9 popen)} may be useful to you, as they fork and exec within
+an async-signal-safe function carefully written to ensure robust program
+behavior, even in the presence of threads.  @xref{Pipes}, for more.
+
 This procedure has been renamed from @code{fork} to avoid a naming conflict
 with the scsh fork.
 @end deffn
diff --git a/libguile/posix.c b/libguile/posix.c
index 4d5fdcf..324f21b 100644
--- a/libguile/posix.c
+++ b/libguile/posix.c
@@ -1249,6 +1249,22 @@ SCM_DEFINE (scm_fork, "primitive-fork", 0, 0, 0,
 #define FUNC_NAME s_scm_fork
 {
   int pid;
+  if (scm_ilength (scm_all_threads ()) != 1)
+    /* Other threads may be holding on to resources that Guile needs --
+       it is not safe to permit one thread to fork while others are
+       running.
+
+       In addition, POSIX clearly specifies that if a multi-threaded
+       program forks, the child must only call functions that are
+       async-signal-safe.  We can't guarantee that in general.  The best
+       we can do is to allow forking only very early, before any call to
+       sigaction spawns the signal-handling thread.  */
+    scm_display
+      (scm_from_latin1_string
+       ("warning: call to primitive-fork while multiple threads are running;\n"
+        "         further behavior unspecified.  See \"Processes\" in the\n"
+        "         manual, for more information.\n"),
+       scm_current_warning_port ());
   pid = fork ();
   if (pid == -1)
     SCM_SYSERROR;
diff --git a/test-suite/Makefile.am b/test-suite/Makefile.am
index 880e1e2..9fba7b8 100644
--- a/test-suite/Makefile.am
+++ b/test-suite/Makefile.am
@@ -23,6 +23,7 @@
 SUBDIRS = standalone vm
 
 SCM_TESTS = tests/00-initial-env.test          \
+           tests/00-socket.test                \
             tests/alist.test                   \
            tests/and-let-star.test             \
            tests/arbiters.test                 \
@@ -114,7 +115,6 @@ SCM_TESTS = tests/00-initial-env.test               \
            tests/regexp.test                   \
            tests/session.test                  \
            tests/signals.test                  \
-           tests/socket.test                   \
            tests/srcprop.test                  \
            tests/srfi-1.test                   \
            tests/srfi-6.test                   \
diff --git a/test-suite/tests/socket.test b/test-suite/tests/00-socket.test
similarity index 100%
rename from test-suite/tests/socket.test
rename to test-suite/tests/00-socket.test


hooks/post-receive
-- 
GNU Guile



reply via email to

[Prev in Thread] Current Thread [Next in Thread]