From 6bb55f7d14c82e43d7fa7bbc5e56a866ac30888f Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 9 Aug 2013 09:09:51 -0600 Subject: [PATCH] Solaris: various repairs Fix threading, including SIGCHLD mask. --- racket/collects/compiler/private/xform.rkt | 2 +- racket/src/configure | 2 +- racket/src/racket/configure.ac | 2 +- racket/src/racket/sconfig.h | 6 ++++++ racket/src/racket/src/place.c | 11 +++++++---- racket/src/racket/src/port.c | 14 ++++++++++---- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/racket/collects/compiler/private/xform.rkt b/racket/collects/compiler/private/xform.rkt index 3cf0e1a54d..9b7c831c48 100644 --- a/racket/collects/compiler/private/xform.rkt +++ b/racket/collects/compiler/private/xform.rkt @@ -895,7 +895,7 @@ __builtin_next_arg __builtin_saveregs __builtin_constant_p __builtin___CFStringMakeConstantString - __error __errno_location __toupper __tolower + __error __errno_location __toupper __tolower ___errno __attribute__ __mode__ ; not really functions in gcc __iob_func ; VC 8 |GetStdHandle| |__CFStringMakeConstantString| diff --git a/racket/src/configure b/racket/src/configure index 317bf84a03..d1ee658d1a 100755 --- a/racket/src/configure +++ b/racket/src/configure @@ -8814,7 +8814,7 @@ if test "${enable_pthread}" = "yes" ; then LDFLAGS="$LDFLAGS -pthread" fi if test "${use_flag_posix_pthread}" = "yes" ; then - PREFLAGS="$PREFLAGS -D_POSIX_PTHREAD_SEMANTICS" + PREFLAGS="$PREFLAGS -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT" fi cat >>confdefs.h <<\_ACEOF diff --git a/racket/src/racket/configure.ac b/racket/src/racket/configure.ac index 32e8581218..096fa988e4 100644 --- a/racket/src/racket/configure.ac +++ b/racket/src/racket/configure.ac @@ -1215,7 +1215,7 @@ if test "${enable_pthread}" = "yes" ; then LDFLAGS="$LDFLAGS -pthread" fi if test "${use_flag_posix_pthread}" = "yes" ; then - PREFLAGS="$PREFLAGS -D_POSIX_PTHREAD_SEMANTICS" + PREFLAGS="$PREFLAGS -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT" fi AC_DEFINE(USE_PTHREAD_INSTEAD_OF_ITIMER, 1, [Pthread timer enabled]) diff --git a/racket/src/racket/sconfig.h b/racket/src/racket/sconfig.h index f475598431..82f3978862 100644 --- a/racket/src/racket/sconfig.h +++ b/racket/src/racket/sconfig.h @@ -118,6 +118,10 @@ # define FMOD_CAN_RETURN_POS_ZERO +# ifdef _POSIX_PTHREAD_SEMANTICS +# define SUBPROCESS_USE_FORK1 +# endif + # ifdef i386 # define MZ_USE_JIT_I386 # define MZ_JIT_USE_MPROTECT @@ -1236,6 +1240,8 @@ should be closed after performing a fork() for `process' and `system' calls. */ + /* SUBPROCESS_USE_FORK1 uses fork1() instead of fork(). */ + /* USE_UNIX_SOCKETS_TCP means that the tcp- procedures can be implemented with the standard Unix socket functions. */ diff --git a/racket/src/racket/src/place.c b/racket/src/racket/src/place.c index 6ad72cb4dc..baf0b1aa35 100644 --- a/racket/src/racket/src/place.c +++ b/racket/src/racket/src/place.c @@ -995,15 +995,18 @@ static void got_sigchld() XFORM_SKIP_PROC void scheme_places_block_child_signal() XFORM_SKIP_PROC { sigset_t set; - sigemptyset(&set); - sigaddset(&set, SIGCHLD); - sigprocmask(SIG_BLOCK, &set, NULL); /* Mac OS X seems to need a handler installed for SIGCHLD to be delivered, since the default is to drop the signal. Also, this handler serves as a back-up alert if some thread is created that - does not block SIGCHLD. */ + does not block SIGCHLD. + Solaris, meanwhile, seems to unmask SIGCHLD as a result of + setting a handler, so do this before masking the signal. */ MZ_SIGSET(SIGCHLD, got_sigchld); + + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + sigprocmask(SIG_BLOCK, &set, NULL); } void scheme_places_unblock_child_signal() XFORM_SKIP_PROC diff --git a/racket/src/racket/src/port.c b/racket/src/racket/src/port.c index 4cf0989951..d0a3b73539 100644 --- a/racket/src/racket/src/port.c +++ b/racket/src/racket/src/port.c @@ -5695,8 +5695,12 @@ static int try_lock(intptr_t fd, int writer, int *_errid) if (!pipe(ofds)) { int pid; +#ifdef SUBPROCESS_USE_FORK1 + pid = fork1(); +#else pid = fork(); - +#endif + if (pid > 0) { /* Original process: */ int errid = 0; @@ -9814,10 +9818,12 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[]) scheme_starting_child(); #endif -#if !defined(__QNX__) - pid = fork(); -#else +#if defined(__QNX__) pid = vfork(); +#elif defined(SUBPROCESS_USE_FORK1) + pid = fork1(); +#else + pid = fork(); #endif if (pid > 0) {