Commit 3e1e1ac2 authored by jokea's avatar jokea Committed by antirez
Browse files

implement aeWait using poll(2). Fixes issue #267.

parent 70381bbf
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <poll.h>
#include <string.h> #include <string.h>
#include "ae.h" #include "ae.h"
...@@ -369,21 +370,17 @@ int aeProcessEvents(aeEventLoop *eventLoop, int flags) ...@@ -369,21 +370,17 @@ int aeProcessEvents(aeEventLoop *eventLoop, int flags)
/* Wait for millseconds until the given file descriptor becomes /* Wait for millseconds until the given file descriptor becomes
* writable/readable/exception */ * writable/readable/exception */
int aeWait(int fd, int mask, long long milliseconds) { int aeWait(int fd, int mask, long long milliseconds) {
struct timeval tv; struct pollfd pfd;
fd_set rfds, wfds, efds;
int retmask = 0, retval; int retmask = 0, retval;
tv.tv_sec = milliseconds/1000; memset(&pfd, 0, sizeof(pfd));
tv.tv_usec = (milliseconds%1000)*1000; pfd.fd = fd;
FD_ZERO(&rfds); if (mask & AE_READABLE) pfd.events |= POLLIN;
FD_ZERO(&wfds); if (mask & AE_WRITABLE) pfd.events |= POLLOUT;
FD_ZERO(&efds);
if ((retval = poll(&pfd, 1, milliseconds))== 1) {
if (mask & AE_READABLE) FD_SET(fd,&rfds); if (pfd.revents & POLLIN) retmask |= AE_READABLE;
if (mask & AE_WRITABLE) FD_SET(fd,&wfds); if (pfd.revents & POLLOUT) retmask |= AE_WRITABLE;
if ((retval = select(fd+1, &rfds, &wfds, &efds, &tv)) > 0) {
if (FD_ISSET(fd,&rfds)) retmask |= AE_READABLE;
if (FD_ISSET(fd,&wfds)) retmask |= AE_WRITABLE;
return retmask; return retmask;
} else { } else {
return retval; return retval;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment