From 604960f5f526f51aa1d20c19f4d77b3d6cc9801e Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 26 Apr 2011 11:11:22 -0600 Subject: [PATCH] places: re-enable (and re-ignore) SIGCHLD in a fork()ed process Relevant to PR 11877 --- src/racket/src/places.c | 11 +++++++++++ src/racket/src/port.c | 3 +++ src/racket/src/schpriv.h | 1 + 3 files changed, 15 insertions(+) diff --git a/src/racket/src/places.c b/src/racket/src/places.c index 12a5e820fc..692183aaac 100644 --- a/src/racket/src/places.c +++ b/src/racket/src/places.c @@ -592,6 +592,17 @@ void scheme_places_block_child_signal() XFORM_SKIP_PROC MZ_SIGSET(SIGCHLD, got_sigchld); } +void scheme_places_unblock_child_signal() XFORM_SKIP_PROC +{ + sigset_t set; + + MZ_SIGSET(SIGCHLD, SIG_IGN); + + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + sigprocmask(SIG_UNBLOCK, &set, NULL); +} + void scheme_places_start_child_signal_handler() { mz_proc_thread *signal_thread; diff --git a/src/racket/src/port.c b/src/racket/src/port.c index 8ee1d7282f..12f0255788 100644 --- a/src/racket/src/port.c +++ b/src/racket/src/port.c @@ -8106,6 +8106,9 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[]) #if !defined(MZ_PLACES_WAITPID) scheme_block_child_signals(0); +#else + if (!pid) + scheme_places_unblock_child_signal(); #endif } diff --git a/src/racket/src/schpriv.h b/src/racket/src/schpriv.h index 11c7999202..c43b7b275b 100644 --- a/src/racket/src/schpriv.h +++ b/src/racket/src/schpriv.h @@ -3631,6 +3631,7 @@ Scheme_Object *scheme_places_deep_copy(Scheme_Object *so); # ifdef UNIX_PROCESSES # define MZ_PLACES_WAITPID void scheme_places_block_child_signal(); +void scheme_places_unblock_child_signal(); void scheme_places_start_child_signal_handler(); int scheme_get_child_status(int pid, int is_group, int *status); int scheme_places_register_child(int pid, int is_group, void *signal_fd, int *status);