From: antirez <antirez@gmail.com>
Date: Wed, 16 Dec 2009 12:30:40 +0000 (-0500)
Subject: Fixed a lame epoll issue
X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/67669f0032b27d9c434bc91b1cf5b199e9077fd2

Fixed a lame epoll issue
---

diff --git a/ae_epoll.c b/ae_epoll.c
index f6371b0b..ce9ce3b0 100644
--- a/ae_epoll.c
+++ b/ae_epoll.c
@@ -29,10 +29,13 @@ static void aeApiFree(aeEventLoop *eventLoop) {
 static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
     aeApiState *state = eventLoop->apidata;
     struct epoll_event ee;
+    /* If the fd was already monitored for some event, we need a MOD
+     * operation. Otherwise we need an ADD operation. */
     int op = eventLoop->events[fd].mask == AE_NONE ?
             EPOLL_CTL_ADD : EPOLL_CTL_MOD;
 
     ee.events = 0;
+    mask |= eventLoop->events[fd].mask; /* Merge old events */
     if (mask & AE_READABLE) ee.events |= EPOLLIN;
     if (mask & AE_WRITABLE) ee.events |= EPOLLOUT;
     if (mask & AE_EXCEPTION) ee.events |= EPOLLPRI;