From 34aea6f7ad99671b66b20533ddf0887729128618 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 10 Apr 2008 20:14:47 +0000 Subject: [PATCH] fix scheduler related to subprocesses svn: r9240 --- src/mzscheme/src/env.c | 2 ++ src/mzscheme/src/port.c | 13 +++++++++---- src/mzscheme/src/thread.c | 8 ++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/mzscheme/src/env.c b/src/mzscheme/src/env.c index 0c602c3023..0055f88bed 100644 --- a/src/mzscheme/src/env.c +++ b/src/mzscheme/src/env.c @@ -403,6 +403,8 @@ Scheme_Env *scheme_basic_env() scheme_starting_up = 0; + --scheme_current_thread->suspend_break; /* created with breaks suspended */ + #ifdef TIME_STARTUP_PROCESS printf("done @ %ld\n#endif\n", scheme_get_process_milliseconds()); #endif diff --git a/src/mzscheme/src/port.c b/src/mzscheme/src/port.c index 227f01a25a..190a2cd1c3 100644 --- a/src/mzscheme/src/port.c +++ b/src/mzscheme/src/port.c @@ -6483,10 +6483,10 @@ static void init_sigchld(void) } } -void scheme_check_child_done() +int scheme_check_child_done() { pid_t result; - int status; + int status, did_one = 0; System_Child *sc, *prev; if (scheme_system_children) { @@ -6512,12 +6512,14 @@ void scheme_check_child_done() } else scheme_system_children = sc->next; - break; + did_one = 1; } } } } while (result > 0); } + + return did_one; } #endif @@ -7980,7 +7982,10 @@ void scheme_signal_received(void) { #if defined(FILES_HAVE_FDS) if (put_external_event_fd) { - write(put_external_event_fd, "!", 1); + int v; + do { + v = write(put_external_event_fd, "!", 1); + } while ((v == -1) && (errno == EINTR)); } #endif #if defined(WINDOWS_PROCESSES) || defined(WINDOWS_FILE_HANDLES) diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index 048ed5e580..8b99bd8e75 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -96,7 +96,7 @@ extern HANDLE scheme_break_semaphore; #include "schfd.h" #if defined(UNIX_PROCESSES) -extern void scheme_check_child_done(); +extern int scheme_check_child_done(); #endif #define DEFAULT_INIT_STACK_SIZE 1000 @@ -2093,6 +2093,8 @@ static Scheme_Thread *make_thread(Scheme_Config *config, process->prev = NULL; process->next = NULL; + process->suspend_break = 1; /* until start-up finished */ + process->error_buf = &main_init_error_buf; thread_swap_callbacks = scheme_null; @@ -2175,7 +2177,6 @@ static Scheme_Thread *make_thread(Scheme_Config *config, process->current_local_env = NULL; - process->suspend_break = 0; process->external_break = 0; process->ran_some = 1; @@ -3457,6 +3458,9 @@ static int check_sleep(int need_activity, int sleep_now) if (needs_sleep_cancelled) return 0; + if (scheme_check_child_done()) + return 0; + if (post_system_idle()) { return 0; }