win32 places: make break-signal semaphore place-local

This commit is contained in:
Matthew Flatt 2011-04-30 07:37:02 -06:00
parent 1f7ac35d8e
commit ddbb3b02a1
3 changed files with 11 additions and 6 deletions

View File

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

View File

@ -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("<redirect-output-port>");
#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.

View File

@ -78,7 +78,7 @@
#if defined(WINDOWS_PROCESSES) || defined(WINDOWS_FILE_HANDLES)
# include <windows.h>
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
}