From 711da950d914579e6ca736740a2b1741c7620001 Mon Sep 17 00:00:00 2001 From: Kurt Stephens Date: Wed, 6 Jun 2012 15:21:55 -0500 Subject: [PATCH 1/2] Event round-robin to balance client activity. --- src/ae.c | 10 +++++++--- src/ae.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ae.c b/src/ae.c index ba53b456805a..26ffad53294a 100644 --- a/src/ae.c +++ b/src/ae.c @@ -64,6 +64,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; @@ -343,11 +344,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 e1dccfc76a68..7e96bf90c6fc 100644 --- a/src/ae.h +++ b/src/ae.h @@ -89,6 +89,7 @@ typedef struct aeEventLoop { int setsize; /* max number of file descriptors tracked */ long long timeEventNextId; aeFileEvent *events; /* Registered events */ + int events_offset; /* Round-robin offset into events. */ aeFiredEvent *fired; /* Fired events */ aeTimeEvent *timeEventHead; int stop; From 78cd5a387d009174b39b5cfcb997c1e99ed7fd22 Mon Sep 17 00:00:00 2001 From: Kurt Stephens Date: Fri, 16 Nov 2012 09:58:39 -0600 Subject: [PATCH 2/2] Wrap events_offset at setsize. --- src/ae.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ae.c b/src/ae.c index fe05852bf42a..94e56dd88089 100644 --- a/src/ae.c +++ b/src/ae.c @@ -364,7 +364,7 @@ int aeProcessEvents(aeEventLoop *eventLoop, int flags) } } - if ( ++ eventLoop->events_offset > eventLoop->setsize ) + if ( ++ eventLoop->events_offset >= eventLoop->setsize ) eventLoop->events_offset = 0; numevents = aeApiPoll(eventLoop, tvp); for (j = 0; j < numevents; j++) {