From dacdf64f59e6abc139475131e9f38b460ed66306 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 18 Jun 2017 07:11:47 -0600 Subject: [PATCH] rktio: fix eventmask handling (for Windows) --- racket/src/racket/src/port.c | 10 +----- racket/src/racket/src/thread.c | 2 -- racket/src/rktio/rktio_poll_set.c | 51 ++++++++++++++++++------------- racket/src/rktio/rktio_private.h | 2 ++ 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/racket/src/racket/src/port.c b/racket/src/racket/src/port.c index 5a5f4bcf84..66715e0202 100644 --- a/racket/src/racket/src/port.c +++ b/racket/src/racket/src/port.c @@ -254,10 +254,6 @@ static void default_sleep(float v, void *fds); static void register_traversers(void); #endif -#if defined(WIN32_FD_HANDLES) -THREAD_LOCAL_DECL(void *scheme_break_semaphore;) -#endif - static Scheme_Object *make_fd_input_port(rktio_fd_t *fd, Scheme_Object *name, int *refcount, int internal); static Scheme_Object *make_fd_output_port(rktio_fd_t *fd, Scheme_Object *name, int read_too, int flush_mode, int *refcount); @@ -481,9 +477,7 @@ void scheme_set_stdio_makers(Scheme_Stdio_Maker_Proc in, void scheme_add_fd_handle(void *h, void *fds, int repost) { -#if defined(WIN32_FD_HANDLES) rktio_poll_set_add_handle(scheme_rktio, (intptr_t)h, fds, repost); -#endif } void scheme_add_fd_nosleep(void *fds) @@ -493,9 +487,7 @@ void scheme_add_fd_nosleep(void *fds) void scheme_add_fd_eventmask(void *fds, int mask) { -#if defined(WIN32_FD_HANDLES) - rktio_poll_set_add_eventmask(scheme_rktio, mask, fds); -#endif + rktio_poll_set_add_eventmask(scheme_rktio, fds, mask); } /*========================================================================*/ diff --git a/racket/src/racket/src/thread.c b/racket/src/racket/src/thread.c index 95bfd81390..2d852dfc96 100644 --- a/racket/src/racket/src/thread.c +++ b/racket/src/racket/src/thread.c @@ -4010,9 +4010,7 @@ static int check_sleep(int need_activity, int sleep_now) p2 = scheme_first_thread; while (p2) { if (p2->ran_some) { -#ifdef RKTIO_SYSTEM_WINDOWS rkio_reset_sleep_backoff(scheme_rktio); -#endif p2->ran_some = 0; } p2 = p2->next; diff --git a/racket/src/rktio/rktio_poll_set.c b/racket/src/rktio/rktio_poll_set.c index 10e3a7c853..cbc38bdbf2 100644 --- a/racket/src/rktio/rktio_poll_set.c +++ b/racket/src/rktio/rktio_poll_set.c @@ -511,15 +511,24 @@ int rktio_fdisset(rktio_poll_set_t *fd, intptr_t n) return 0; } -void rktio_merge_fd_sets(rktio_poll_set_t *fds, rktio_poll_set_t *src_fds) +void rktio_merge_fd_sets(rktio_poll_set_t *all_fds, rktio_poll_set_t *src_all_fds) { + int j; intptr_t i; - for (i = src_fds->added; i--; ) { - if (src_fds->sockets[i] != INVALID_SOCKET) - rktio_fdset(fds, (intptr_t)src_fds->sockets[i]); + + for (j = 0; j < 3; j++) { + rktio_poll_set_t *fds; + rktio_poll_set_t *src_fds; + fds = rktio_get_fdset(all_fds, j); + src_fds = rktio_get_fdset(src_all_fds, j); + for (i = src_fds->added; i--; ) { + if (src_fds->sockets[i] != INVALID_SOCKET) + rktio_fdset(fds, (intptr_t)src_fds->sockets[i]); + } + if (src_fds->no_sleep) + fds->no_sleep = 1; + fds->wait_event_mask |= src_fds->wait_event_mask; } - if (src_fds->no_sleep) - fds->no_sleep = 1; } void rktio_clean_fd_set(rktio_poll_set_t *fds) @@ -573,7 +582,7 @@ static int fdset_has_nosleep(rktio_poll_set_t *fds) return fds->no_sleep; } -void rktio_poll_set_eventmask(rktio_poll_set_t *fds, int mask) +void rktio_poll_set_add_eventmask(rktio_t *rktio, rktio_poll_set_t *fds, int mask) { fds->wait_event_mask |= mask; } @@ -1044,12 +1053,9 @@ static void clean_up_wait(rktio_t *rktio, WaitForSingleObject(rktio->break_semaphore, 0); } -static int made_progress; -static DWORD max_sleep_time; - void rkio_reset_sleep_backoff(rktio_t *rktio) { - made_progress = 1; + rktio->made_progress = 1; } #endif @@ -1243,19 +1249,20 @@ void rktio_sleep(rktio_t *rktio, float nsecs, rktio_poll_set_t *fds, rktio_ltps_ progress. */ if (fds->wait_event_mask && GetQueueStatus(fds->wait_event_mask)) { - if (!made_progress) { + if (!rktio->made_progress) { /* Ok, we've gone around at least once. */ - if (max_sleep_time < 0x20000000) - max_sleep_time *= 2; + if (rktio->max_sleep_time < 0x20000000) { + rktio->max_sleep_time *= 2; + } } else { /* Starting back-off mode */ - made_progress = 0; - max_sleep_time = 5; + rktio->made_progress = 0; + rktio->max_sleep_time = 5; } } else { /* Disable back-off mode */ - made_progress = 1; - max_sleep_time = 0; + rktio->made_progress = 1; + rktio->max_sleep_time = 0; } /* Wait for HANDLE-based input: */ @@ -1266,11 +1273,11 @@ void rktio_sleep(rktio_t *rktio, float nsecs, rktio_poll_set_t *fds, rktio_ltps_ msec = 100000000; else msec = (DWORD)(nsecs * 1000); - if (max_sleep_time && (msec > max_sleep_time)) - msec = max_sleep_time; + if (rktio->max_sleep_time && (msec > rktio->max_sleep_time)) + msec = rktio->max_sleep_time; } else { - if (max_sleep_time) - msec = max_sleep_time; + if (rktio->max_sleep_time) + msec = rktio->max_sleep_time; else msec = INFINITE; } diff --git a/racket/src/rktio/rktio_private.h b/racket/src/rktio/rktio_private.h index 959e83c3ee..d2ef62e137 100644 --- a/racket/src/rktio/rktio_private.h +++ b/racket/src/rktio/rktio_private.h @@ -48,6 +48,8 @@ struct rktio_t { HANDLE break_semaphore; int wsr_size; struct rktio_socket_t *wsr_array; + int made_progress; + DWORD max_sleep_time; #endif #ifdef USE_FAR_RKTIO_FDCALLS /* A single fdset that can be reused for immediate actions: */