From 6f0b08a4008f36bc937452b302835238d6fec61d Mon Sep 17 00:00:00 2001 From: huitema Date: Sun, 26 Mar 2017 10:07:44 -0500 Subject: [PATCH] Fixing the select event loop so it does not give up for naked timers in Windows. Making sure the poll event loop works on windows. Fixing the poll event loop so it does not give up for naked timers in Windows. --- src/extension/poll_eventloop.c | 6 ++++++ src/extension/select_eventloop.c | 10 ++++++++++ src/stub.c | 4 ++++ 3 files changed, 20 insertions(+) diff --git a/src/extension/poll_eventloop.c b/src/extension/poll_eventloop.c index b59ad64d..cb629d18 100644 --- a/src/extension/poll_eventloop.c +++ b/src/extension/poll_eventloop.c @@ -30,8 +30,10 @@ #ifdef HAVE_SYS_POLL_H #include #else +#ifndef USE_WINSOCK #include #endif +#endif #ifdef HAVE_SYS_RESOURCE_H #include #endif @@ -402,6 +404,10 @@ poll_eventloop_run_once(getdns_eventloop *loop, int blocking) , poll_timeout ); #ifdef USE_WINSOCK + if (poll_loop->fd_events_free == 0) + { + Sleep(poll_timeout); + } else if (WSAPoll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { #else if (poll(poll_loop->pfds, poll_loop->fd_events_free, poll_timeout) < 0) { diff --git a/src/extension/select_eventloop.c b/src/extension/select_eventloop.c index 1b889fc1..47769afd 100644 --- a/src/extension/select_eventloop.c +++ b/src/extension/select_eventloop.c @@ -234,6 +234,16 @@ select_eventloop_run_once(getdns_eventloop *loop, int blocking) tv.tv_sec = (long)((timeout - now) / 1000000); tv.tv_usec = (long)((timeout - now) % 1000000); } +#ifdef USE_WINSOCK + if (max_fd == -1) + { + if (timeout != TIMEOUT_FOREVER) + { + uint32_t timeout_ms = (tv.tv_usec / 1000) + (tv.tv_sec * 1000); + Sleep(timeout_ms); + } + } else +#endif if (select(max_fd + 1, &readfds, &writefds, NULL, (timeout == TIMEOUT_FOREVER ? NULL : &tv)) < 0) { perror("select() failed"); diff --git a/src/stub.c b/src/stub.c index 29112cc3..322fa0d7 100644 --- a/src/stub.c +++ b/src/stub.c @@ -36,7 +36,11 @@ # ifdef HAVE_SYS_POLL_H # include # else +#ifdef USE_WINSOCK +#define poll(fdarray, nbsockets, timer) WSAPoll(fdarray, nbsockets, timer) +#else # include +#endif # endif #endif #include "debug.h"