support multiple signal-received handles

svn: r16838
This commit is contained in:
Matthew Flatt 2009-11-17 19:22:43 +00:00
parent a91ff1c603
commit 1fac4829a6
9 changed files with 39 additions and 4 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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