From ddbb3b02a1d70932d64bf2fc3bc8c19058a4b58e Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 30 Apr 2011 07:37:02 -0600 Subject: [PATCH] win32 places: make break-signal semaphore place-local --- src/racket/include/schthread.h | 5 +++++ src/racket/src/port.c | 8 ++++---- src/racket/src/thread.c | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/racket/include/schthread.h b/src/racket/include/schthread.h index e27d86a24e..21ae5d8755 100644 --- a/src/racket/include/schthread.h +++ b/src/racket/include/schthread.h @@ -169,8 +169,12 @@ typedef struct Thread_Local_Variables { struct Scheme_Object *scheme_orig_stdin_port_; struct mz_fd_set *scheme_fd_set_; struct Scheme_Custodian *new_port_cust_; +#if (defined(__WIN32__) || defined(WIN32) || defined(_WIN32)) + void *scheme_break_semaphore_; +#else int external_event_fd_; int put_external_event_fd_; +#endif char *read_string_byte_buffer_; struct ITimer_Data *itimerdata_; char *quick_buffer_; @@ -490,6 +494,7 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define scheme_orig_stdin_port XOA (scheme_get_thread_local_variables()->scheme_orig_stdin_port_) #define scheme_fd_set XOA (scheme_get_thread_local_variables()->scheme_fd_set_) #define new_port_cust XOA (scheme_get_thread_local_variables()->new_port_cust_) +#define scheme_break_semaphore XOA (scheme_get_thread_local_variables()->scheme_break_semaphore_) #define external_event_fd XOA (scheme_get_thread_local_variables()->external_event_fd_) #define put_external_event_fd XOA (scheme_get_thread_local_variables()->put_external_event_fd_) #define read_string_byte_buffer XOA (scheme_get_thread_local_variables()->read_string_byte_buffer_) diff --git a/src/racket/src/port.c b/src/racket/src/port.c index 12f0255788..a3a72bc574 100644 --- a/src/racket/src/port.c +++ b/src/racket/src/port.c @@ -401,7 +401,7 @@ static void register_traversers(void); #endif #if defined(WIN32_FD_HANDLES) -OS_SEMAPHORE_TYPE scheme_break_semaphore; +THREAD_LOCAL_DECL(void *scheme_break_semaphore;) #endif #ifdef MZ_FDS @@ -542,7 +542,7 @@ scheme_init_port (Scheme_Env *env) scheme_redirect_output_port_type = scheme_make_port_type(""); #ifdef WIN32_FD_HANDLES - scheme_break_semaphore = CreateSemaphore(NULL, 0, 1, NULL); + scheme_break_semaphore = (void*)CreateSemaphore(NULL, 0, 1, NULL); /* We'll need to know whether this is Win95 or WinNT: */ { @@ -8549,7 +8549,7 @@ static void clean_up_wait(intptr_t result, OS_SEMAPHORE_TYPE *array, } /* Clear out break semaphore */ - WaitForSingleObject(scheme_break_semaphore, 0); + WaitForSingleObject((HANDLE)scheme_break_semaphore, 0); } static int made_progress; @@ -8709,7 +8709,7 @@ static void default_sleep(float v, void *fds) if (!count) { array = just_two_array; } - break_sema = scheme_break_semaphore; + break_sema = (HANDLE)scheme_break_semaphore; array[count++] = break_sema; /* Extensions may handle events. diff --git a/src/racket/src/thread.c b/src/racket/src/thread.c index ff56eecb73..ecc207dbe1 100644 --- a/src/racket/src/thread.c +++ b/src/racket/src/thread.c @@ -78,7 +78,7 @@ #if defined(WINDOWS_PROCESSES) || defined(WINDOWS_FILE_HANDLES) # include -extern HANDLE scheme_break_semaphore; +THREAD_LOCAL_DECL(extern void *scheme_break_semaphore;) #endif #if defined(FILES_HAVE_FDS) \ @@ -3784,7 +3784,7 @@ void scheme_break_thread(Scheme_Thread *p) scheme_weak_resume_thread(p); # if defined(WINDOWS_PROCESSES) || defined(WINDOWS_FILE_HANDLES) if (SAME_OBJ(p, scheme_main_thread)) - ReleaseSemaphore(scheme_break_semaphore, 1, NULL); + ReleaseSemaphore((HANDLE)scheme_break_semaphore, 1, NULL); # endif }