*
* On Windows system:
*
- * Register 'wevent' handle for the specified 'events'. These wevents are
- * given to the handleMultipleObjects() to be polled. The event
- * registration is one-shot: only the following call to poll_block() is
- * affected. The event will need to be re-registered after poll_block() is
- * called if it is to persist.
+ * If both 'wevent' handle and 'fd' is specified, associate the 'fd' with
+ * with that 'wevent' for 'events' (implemented in poll_block()).
+ * In case of no 'fd' specified, wake up on any event on that 'wevent'.
+ * These wevents are given to the WaitForMultipleObjects() to be polled.
+ * The event registration is one-shot: only the following call to
+ * poll_block() is affected. The event will need to be re-registered after
+ * poll_block() is called if it is to persist.
*
* ('where' is used in debug logging. Commonly one would use poll_fd_wait() to
* automatically provide the caller's source file and line number for
pollfds[i] = node->pollfd;
#ifdef _WIN32
wevents[i] = node->wevent;
+ if (node->pollfd.fd && node->wevent) {
+ short int wsa_events = 0;
+ if (node->pollfd.events & POLLIN) {
+ wsa_events |= FD_READ | FD_ACCEPT | FD_CLOSE;
+ }
+ if (node->pollfd.events & POLLOUT) {
+ wsa_events |= FD_WRITE | FD_CONNECT | FD_CLOSE;
+ }
+ WSAEventSelect(node->pollfd.fd, node->wevent, wsa_events);
+ }
#endif
i++;
}
void poll_fd_wait_at(int fd, HANDLE wevent, short int events, const char *where);
#ifndef _WIN32
#define poll_fd_wait(fd, events) poll_fd_wait_at(fd, 0, events, SOURCE_LOCATOR)
-#else
-#define poll_fd_wait_event(fd, wevent, events) poll_fd_wait_at(fd, wevent, events, SOURCE_LOCATOR)
#endif
+#define poll_fd_wait_event(fd, wevent, events) \
+ poll_fd_wait_at(fd, wevent, events, SOURCE_LOCATOR)
void poll_timer_wait_at(long long int msec, const char *where);
#define poll_timer_wait(msec) poll_timer_wait_at(msec, SOURCE_LOCATOR)