X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/266373b2834efa11b83e681bb211a0cd6c922eaa..f6c0bba8bc1b11fd789b0139dd86c852194ebc4c:/ae.c diff --git a/ae.c b/ae.c index 4f12e410..25e55fde 100644 --- a/ae.c +++ b/ae.c @@ -45,7 +45,11 @@ #ifdef HAVE_EPOLL #include "ae_epoll.c" #else -#include "ae_select.c" + #ifdef HAVE_KQUEUE + #include "ae_kqueue.c" + #else + #include "ae_select.c" + #endif #endif aeEventLoop *aeCreateEventLoop(void) { @@ -89,7 +93,6 @@ int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, fe->mask |= mask; if (mask & AE_READABLE) fe->rfileProc = proc; if (mask & AE_WRITABLE) fe->wfileProc = proc; - if (mask & AE_EXCEPTION) fe->efileProc = proc; fe->clientData = clientData; if (fd > eventLoop->maxfd) eventLoop->maxfd = fd; @@ -321,18 +324,19 @@ int aeProcessEvents(aeEventLoop *eventLoop, int flags) aeFileEvent *fe = &eventLoop->events[eventLoop->fired[j].fd]; int mask = eventLoop->fired[j].mask; int fd = eventLoop->fired[j].fd; + int rfired = 0; /* note the fe->mask & mask & ... code: maybe an already processed * event removed an element that fired and we still didn't * processed, so we check if the event is still valid. */ - if (fe->mask & mask & AE_READABLE) + if (fe->mask & mask & AE_READABLE) { + rfired = 1; fe->rfileProc(eventLoop,fd,fe->clientData,mask); - if (fe->mask & mask & AE_WRITABLE && fe->wfileProc != fe->rfileProc) - fe->wfileProc(eventLoop,fd,fe->clientData,mask); - if (fe->mask & mask & AE_EXCEPTION && - fe->efileProc != fe->wfileProc && - fe->efileProc != fe->rfileProc) - fe->efileProc(eventLoop,fd,fe->clientData,mask); + } + if (fe->mask & mask & AE_WRITABLE) { + if (!rfired || fe->wfileProc != fe->rfileProc) + fe->wfileProc(eventLoop,fd,fe->clientData,mask); + } processed++; } } @@ -358,20 +362,21 @@ int aeWait(int fd, int mask, long long milliseconds) { if (mask & AE_READABLE) FD_SET(fd,&rfds); if (mask & AE_WRITABLE) FD_SET(fd,&wfds); - if (mask & AE_EXCEPTION) FD_SET(fd,&efds); 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; - if (FD_ISSET(fd,&efds)) retmask |= AE_EXCEPTION; return retmask; } else { return retval; } } -void aeMain(aeEventLoop *eventLoop) -{ +void aeMain(aeEventLoop *eventLoop) { eventLoop->stop = 0; while (!eventLoop->stop) aeProcessEvents(eventLoop, AE_ALL_EVENTS); } + +char *aeGetApiName(void) { + return aeApiName(); +}