rktio: fix eventmask handling (for Windows)

This commit is contained in:
Matthew Flatt 2017-06-18 07:11:47 -06:00
parent 36ca1361d9
commit dacdf64f59
4 changed files with 32 additions and 33 deletions

View File

@ -254,10 +254,6 @@ static void default_sleep(float v, void *fds);
static void register_traversers(void); static void register_traversers(void);
#endif #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_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); 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) 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); rktio_poll_set_add_handle(scheme_rktio, (intptr_t)h, fds, repost);
#endif
} }
void scheme_add_fd_nosleep(void *fds) 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) void scheme_add_fd_eventmask(void *fds, int mask)
{ {
#if defined(WIN32_FD_HANDLES) rktio_poll_set_add_eventmask(scheme_rktio, fds, mask);
rktio_poll_set_add_eventmask(scheme_rktio, mask, fds);
#endif
} }
/*========================================================================*/ /*========================================================================*/

View File

@ -4010,9 +4010,7 @@ static int check_sleep(int need_activity, int sleep_now)
p2 = scheme_first_thread; p2 = scheme_first_thread;
while (p2) { while (p2) {
if (p2->ran_some) { if (p2->ran_some) {
#ifdef RKTIO_SYSTEM_WINDOWS
rkio_reset_sleep_backoff(scheme_rktio); rkio_reset_sleep_backoff(scheme_rktio);
#endif
p2->ran_some = 0; p2->ran_some = 0;
} }
p2 = p2->next; p2 = p2->next;

View File

@ -511,15 +511,24 @@ int rktio_fdisset(rktio_poll_set_t *fd, intptr_t n)
return 0; 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; intptr_t 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--; ) { for (i = src_fds->added; i--; ) {
if (src_fds->sockets[i] != INVALID_SOCKET) if (src_fds->sockets[i] != INVALID_SOCKET)
rktio_fdset(fds, (intptr_t)src_fds->sockets[i]); rktio_fdset(fds, (intptr_t)src_fds->sockets[i]);
} }
if (src_fds->no_sleep) if (src_fds->no_sleep)
fds->no_sleep = 1; fds->no_sleep = 1;
fds->wait_event_mask |= src_fds->wait_event_mask;
}
} }
void rktio_clean_fd_set(rktio_poll_set_t *fds) 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; 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; fds->wait_event_mask |= mask;
} }
@ -1044,12 +1053,9 @@ static void clean_up_wait(rktio_t *rktio,
WaitForSingleObject(rktio->break_semaphore, 0); WaitForSingleObject(rktio->break_semaphore, 0);
} }
static int made_progress;
static DWORD max_sleep_time;
void rkio_reset_sleep_backoff(rktio_t *rktio) void rkio_reset_sleep_backoff(rktio_t *rktio)
{ {
made_progress = 1; rktio->made_progress = 1;
} }
#endif #endif
@ -1243,19 +1249,20 @@ void rktio_sleep(rktio_t *rktio, float nsecs, rktio_poll_set_t *fds, rktio_ltps_
progress. */ progress. */
if (fds->wait_event_mask && GetQueueStatus(fds->wait_event_mask)) { 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. */ /* Ok, we've gone around at least once. */
if (max_sleep_time < 0x20000000) if (rktio->max_sleep_time < 0x20000000) {
max_sleep_time *= 2; rktio->max_sleep_time *= 2;
}
} else { } else {
/* Starting back-off mode */ /* Starting back-off mode */
made_progress = 0; rktio->made_progress = 0;
max_sleep_time = 5; rktio->max_sleep_time = 5;
} }
} else { } else {
/* Disable back-off mode */ /* Disable back-off mode */
made_progress = 1; rktio->made_progress = 1;
max_sleep_time = 0; rktio->max_sleep_time = 0;
} }
/* Wait for HANDLE-based input: */ /* 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; msec = 100000000;
else else
msec = (DWORD)(nsecs * 1000); msec = (DWORD)(nsecs * 1000);
if (max_sleep_time && (msec > max_sleep_time)) if (rktio->max_sleep_time && (msec > rktio->max_sleep_time))
msec = max_sleep_time; msec = rktio->max_sleep_time;
} else { } else {
if (max_sleep_time) if (rktio->max_sleep_time)
msec = max_sleep_time; msec = rktio->max_sleep_time;
else else
msec = INFINITE; msec = INFINITE;
} }

View File

@ -48,6 +48,8 @@ struct rktio_t {
HANDLE break_semaphore; HANDLE break_semaphore;
int wsr_size; int wsr_size;
struct rktio_socket_t *wsr_array; struct rktio_socket_t *wsr_array;
int made_progress;
DWORD max_sleep_time;
#endif #endif
#ifdef USE_FAR_RKTIO_FDCALLS #ifdef USE_FAR_RKTIO_FDCALLS
/* A single fdset that can be reused for immediate actions: */ /* A single fdset that can be reused for immediate actions: */