Skip to content

Commit 11f3045

Browse files
committed
Dynamically adjust ae events and fired counts
1 parent 0a8e546 commit 11f3045

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

src/ae.c

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,17 @@
4242
#endif
4343
#endif
4444

45-
45+
#define INITIAL_EVENT 32
4646
aeEventLoop *aeCreateEventLoop(int setsize) {
4747
aeEventLoop *eventLoop;
4848
int i;
4949

5050
monotonicInit(); /* just in case the calling app didn't initialize */
5151

5252
if ((eventLoop = zmalloc(sizeof(*eventLoop))) == NULL) goto err;
53-
eventLoop->events = zmalloc(sizeof(aeFileEvent)*setsize);
54-
eventLoop->fired = zmalloc(sizeof(aeFiredEvent)*setsize);
53+
eventLoop->nevents = setsize < INITIAL_EVENT ? setsize : INITIAL_EVENT;
54+
eventLoop->events = zmalloc(sizeof(aeFileEvent)*eventLoop->nevents);
55+
eventLoop->fired = zmalloc(sizeof(aeFiredEvent)*eventLoop->nevents);
5556
if (eventLoop->events == NULL || eventLoop->fired == NULL) goto err;
5657
eventLoop->setsize = setsize;
5758
eventLoop->timeEventHead = NULL;
@@ -64,7 +65,7 @@ aeEventLoop *aeCreateEventLoop(int setsize) {
6465
if (aeApiCreate(eventLoop) == -1) goto err;
6566
/* Events with mask == AE_NONE are not set. So let's initialize the
6667
* vector with it. */
67-
for (i = 0; i < setsize; i++)
68+
for (i = 0; i < eventLoop->nevents; i++)
6869
eventLoop->events[i].mask = AE_NONE;
6970
return eventLoop;
7071

@@ -102,20 +103,19 @@ void aeSetDontWait(aeEventLoop *eventLoop, int noWait) {
102103
*
103104
* Otherwise AE_OK is returned and the operation is successful. */
104105
int aeResizeSetSize(aeEventLoop *eventLoop, int setsize) {
105-
int i;
106-
107106
if (setsize == eventLoop->setsize) return AE_OK;
108107
if (eventLoop->maxfd >= setsize) return AE_ERR;
109108
if (aeApiResize(eventLoop,setsize) == -1) return AE_ERR;
110109

111-
eventLoop->events = zrealloc(eventLoop->events,sizeof(aeFileEvent)*setsize);
112-
eventLoop->fired = zrealloc(eventLoop->fired,sizeof(aeFiredEvent)*setsize);
113110
eventLoop->setsize = setsize;
114111

115-
/* Make sure that if we created new slots, they are initialized with
116-
* an AE_NONE mask. */
117-
for (i = eventLoop->maxfd+1; i < setsize; i++)
118-
eventLoop->events[i].mask = AE_NONE;
112+
/* If the current allocated space is larger than the requested size,
113+
* we need to shrink it to the requested size. */
114+
if (setsize < eventLoop->nevents) {
115+
eventLoop->events = zrealloc(eventLoop->events,sizeof(aeFileEvent)*setsize);
116+
eventLoop->fired = zrealloc(eventLoop->fired,sizeof(aeFiredEvent)*setsize);
117+
eventLoop->nevents = setsize;
118+
}
119119
return AE_OK;
120120
}
121121

@@ -147,6 +147,22 @@ int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,
147147
errno = ERANGE;
148148
return AE_ERR;
149149
}
150+
151+
/* Resize the events and fired arrays if the file
152+
* descriptor exceeds the current number of events. */
153+
if (unlikely(fd >= eventLoop->nevents)) {
154+
int newnevents = eventLoop->nevents;
155+
newnevents = (newnevents * 2 > fd) ? newnevents * 2 : fd;
156+
newnevents = (newnevents > eventLoop->setsize) ? eventLoop->setsize : newnevents;
157+
eventLoop->events = zrealloc(eventLoop->events, sizeof(aeFileEvent) * newnevents);
158+
eventLoop->fired = zrealloc(eventLoop->fired, sizeof(aeFiredEvent) * newnevents);
159+
160+
/* Initialize new slots with an AE_NONE mask */
161+
for (int i = eventLoop->nevents; i < newnevents; i++)
162+
eventLoop->events[i].mask = AE_NONE;
163+
eventLoop->nevents = newnevents;
164+
}
165+
150166
aeFileEvent *fe = &eventLoop->events[fd];
151167

152168
if (aeApiAddEvent(eventLoop, fd, mask) == -1)

src/ae.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ typedef struct aeEventLoop {
7979
int maxfd; /* highest file descriptor currently registered */
8080
int setsize; /* max number of file descriptors tracked */
8181
long long timeEventNextId;
82+
int nevents; /* Size of Registered events */
8283
aeFileEvent *events; /* Registered events */
8384
aeFiredEvent *fired; /* Fired events */
8485
aeTimeEvent *timeEventHead;

0 commit comments

Comments
 (0)