From 1fac4829a667d892fdc2948f3c8efd0e169e8c2d Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 17 Nov 2009 19:22:43 +0000 Subject: [PATCH] support multiple signal-received handles svn: r16838 --- src/mzscheme/include/mzscheme.exp | 2 ++ src/mzscheme/include/mzscheme3m.exp | 2 ++ src/mzscheme/include/mzwin.def | 2 ++ src/mzscheme/include/mzwin3m.def | 2 ++ src/mzscheme/src/port.c | 27 +++++++++++++++++++++++---- src/mzscheme/src/schemef.h | 2 ++ src/mzscheme/src/schemex.h | 2 ++ src/mzscheme/src/schemex.inc | 2 ++ src/mzscheme/src/schemexm.h | 2 ++ 9 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/mzscheme/include/mzscheme.exp b/src/mzscheme/include/mzscheme.exp index e5033d29f5..6441f54693 100644 --- a/src/mzscheme/include/mzscheme.exp +++ b/src/mzscheme/include/mzscheme.exp @@ -575,4 +575,6 @@ scheme_make_provided_string scheme_make_args_string scheme_system_library_subpath scheme_signal_received +scheme_signal_received_at +scheme_get_signal_handle scheme_char_strlen diff --git a/src/mzscheme/include/mzscheme3m.exp b/src/mzscheme/include/mzscheme3m.exp index 0b81542ee1..bf70128fd1 100644 --- a/src/mzscheme/include/mzscheme3m.exp +++ b/src/mzscheme/include/mzscheme3m.exp @@ -587,4 +587,6 @@ scheme_make_provided_string scheme_make_args_string scheme_system_library_subpath scheme_signal_received +scheme_signal_received_at +scheme_get_signal_handle scheme_char_strlen diff --git a/src/mzscheme/include/mzwin.def b/src/mzscheme/include/mzwin.def index 69d58bb2ec..c27049c150 100644 --- a/src/mzscheme/include/mzwin.def +++ b/src/mzscheme/include/mzwin.def @@ -563,4 +563,6 @@ EXPORTS scheme_make_args_string scheme_system_library_subpath scheme_signal_received + scheme_signal_received_at + scheme_get_signal_handle scheme_char_strlen diff --git a/src/mzscheme/include/mzwin3m.def b/src/mzscheme/include/mzwin3m.def index 97c236b7dd..7dbd4a3bf8 100644 --- a/src/mzscheme/include/mzwin3m.def +++ b/src/mzscheme/include/mzwin3m.def @@ -579,4 +579,6 @@ EXPORTS scheme_make_args_string scheme_system_library_subpath scheme_signal_received + scheme_signal_received_at + scheme_get_signal_handle scheme_char_strlen diff --git a/src/mzscheme/src/port.c b/src/mzscheme/src/port.c index 76909f678c..e10f7176da 100644 --- a/src/mzscheme/src/port.c +++ b/src/mzscheme/src/port.c @@ -8369,22 +8369,41 @@ END_XFORM_SKIP; START_XFORM_SKIP; #endif -void scheme_signal_received(void) +void scheme_signal_received_at(void *h) /* Ensure that MzScheme wakes up if asleep. */ { #if defined(FILES_HAVE_FDS) - if (put_external_event_fd) { + int put_ext_event_fd = *(int *)h; + if (put_ext_event_fd) { int v; do { - v = write(put_external_event_fd, "!", 1); + v = write(put_ext_event_fd, "!", 1); } while ((v == -1) && (errno == EINTR)); } #endif #if defined(WINDOWS_PROCESSES) || defined(WINDOWS_FILE_HANDLES) - ReleaseSemaphore(scheme_break_semaphore, 1, NULL); + ReleaseSemaphore(*(OS_SEMAPHORE_TYPE *)h, 1, NULL); #endif } +void *scheme_get_signal_handle() +{ +#if defined(FILES_HAVE_FDS) + return &put_external_event_fd; +#else +# if defined(WINDOWS_PROCESSES) || defined(WINDOWS_FILE_HANDLES) + return &scheme_break_semaphore; +# else + return NULL; +# endif +#endif +} + +void scheme_signal_received(void) +{ + scheme_signal_received_at(scheme_get_signal_handle()); +} + #ifdef MZ_XFORM END_XFORM_SKIP; #endif diff --git a/src/mzscheme/src/schemef.h b/src/mzscheme/src/schemef.h index 7335bdc62d..825c6177b6 100644 --- a/src/mzscheme/src/schemef.h +++ b/src/mzscheme/src/schemef.h @@ -1089,5 +1089,7 @@ MZ_EXTERN char *scheme_make_args_string(char *s, int which, int argc, Scheme_Obj MZ_EXTERN const char *scheme_system_library_subpath(); MZ_EXTERN void scheme_signal_received(void); +MZ_EXTERN void scheme_signal_received_at(void *); +MZ_EXTERN void *scheme_get_signal_handle(); MZ_EXTERN int scheme_char_strlen(const mzchar *s); diff --git a/src/mzscheme/src/schemex.h b/src/mzscheme/src/schemex.h index 018fe8a593..7bc7e0031b 100644 --- a/src/mzscheme/src/schemex.h +++ b/src/mzscheme/src/schemex.h @@ -899,6 +899,8 @@ char *(*scheme_make_provided_string)(Scheme_Object *o, int count, int *len); char *(*scheme_make_args_string)(char *s, int which, int argc, Scheme_Object **argv, long *len); const char *(*scheme_system_library_subpath)(); void (*scheme_signal_received)(void); +void (*scheme_signal_received_at)(void *); +void *(*scheme_get_signal_handle)(); int (*scheme_char_strlen)(const mzchar *s); #ifndef SCHEME_EX_INLINE } Scheme_Extension_Table; diff --git a/src/mzscheme/src/schemex.inc b/src/mzscheme/src/schemex.inc index bd758f5808..6ac238295f 100644 --- a/src/mzscheme/src/schemex.inc +++ b/src/mzscheme/src/schemex.inc @@ -633,4 +633,6 @@ scheme_extension_table->scheme_make_args_string = scheme_make_args_string; scheme_extension_table->scheme_system_library_subpath = scheme_system_library_subpath; scheme_extension_table->scheme_signal_received = scheme_signal_received; + scheme_extension_table->scheme_signal_received_at = scheme_signal_received_at; + scheme_extension_table->scheme_get_signal_handle = scheme_get_signal_handle; scheme_extension_table->scheme_char_strlen = scheme_char_strlen; diff --git a/src/mzscheme/src/schemexm.h b/src/mzscheme/src/schemexm.h index 35f01c2599..b31346f008 100644 --- a/src/mzscheme/src/schemexm.h +++ b/src/mzscheme/src/schemexm.h @@ -633,6 +633,8 @@ #define scheme_make_args_string (scheme_extension_table->scheme_make_args_string) #define scheme_system_library_subpath (scheme_extension_table->scheme_system_library_subpath) #define scheme_signal_received (scheme_extension_table->scheme_signal_received) +#define scheme_signal_received_at (scheme_extension_table->scheme_signal_received_at) +#define scheme_get_signal_handle (scheme_extension_table->scheme_get_signal_handle) #define scheme_char_strlen (scheme_extension_table->scheme_char_strlen) #ifdef MZ_PRECISE_GC #pragma GC_VARIABLE_STACK_THOUGH_TABLE