diff --git a/src/ae.c b/src/ae.c index d2faed326307..94e56dd88089 100644 --- a/src/ae.c +++ b/src/ae.c @@ -65,6 +65,7 @@ aeEventLoop *aeCreateEventLoop(int setsize) { if ((eventLoop = zmalloc(sizeof(*eventLoop))) == NULL) goto err; eventLoop->events = zmalloc(sizeof(aeFileEvent)*setsize); + eventLoop->events_offset = 0; eventLoop->fired = zmalloc(sizeof(aeFiredEvent)*setsize); if (eventLoop->events == NULL || eventLoop->fired == NULL) goto err; eventLoop->setsize = setsize; @@ -363,11 +364,14 @@ int aeProcessEvents(aeEventLoop *eventLoop, int flags) } } + if ( ++ eventLoop->events_offset >= eventLoop->setsize ) + eventLoop->events_offset = 0; numevents = aeApiPoll(eventLoop, tvp); for (j = 0; j < numevents; j++) { - aeFileEvent *fe = &eventLoop->events[eventLoop->fired[j].fd]; - int mask = eventLoop->fired[j].mask; - int fd = eventLoop->fired[j].fd; + aeFiredEvent *fired = &eventLoop->fired[(j + eventLoop->events_offset) % numevents]; + aeFileEvent *fe = &eventLoop->events[fired->fd]; + int mask = fired->mask; + int fd = fired->fd; int rfired = 0; /* note the fe->mask & mask & ... code: maybe an already processed diff --git a/src/ae.h b/src/ae.h index 4d89502429d9..bbc0f5962cb8 100644 --- a/src/ae.h +++ b/src/ae.h @@ -90,6 +90,7 @@ typedef struct aeEventLoop { long long timeEventNextId; time_t lastTime; /* Used to detect system clock skew */ aeFileEvent *events; /* Registered events */ + int events_offset; /* Round-robin offset into events. */ aeFiredEvent *fired; /* Fired events */ aeTimeEvent *timeEventHead; int stop;