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 d23fb61f..2acf0708 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"