From 11f3045dccd2de475c20d5577157e95c5a3d30de Mon Sep 17 00:00:00 2001 From: "debing.sun" Date: Mon, 4 Nov 2024 08:38:12 +0800 Subject: [PATCH 1/2] Dynamically adjust ae events and fired counts --- src/ae.c | 40 ++++++++++++++++++++++++++++------------ src/ae.h | 1 + 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/ae.c b/src/ae.c index 3d3569865ae..6e3b7d83484 100644 --- a/src/ae.c +++ b/src/ae.c @@ -42,7 +42,7 @@ #endif #endif - +#define INITIAL_EVENT 32 aeEventLoop *aeCreateEventLoop(int setsize) { aeEventLoop *eventLoop; int i; @@ -50,8 +50,9 @@ aeEventLoop *aeCreateEventLoop(int setsize) { monotonicInit(); /* just in case the calling app didn't initialize */ if ((eventLoop = zmalloc(sizeof(*eventLoop))) == NULL) goto err; - eventLoop->events = zmalloc(sizeof(aeFileEvent)*setsize); - eventLoop->fired = zmalloc(sizeof(aeFiredEvent)*setsize); + eventLoop->nevents = setsize < INITIAL_EVENT ? setsize : INITIAL_EVENT; + eventLoop->events = zmalloc(sizeof(aeFileEvent)*eventLoop->nevents); + eventLoop->fired = zmalloc(sizeof(aeFiredEvent)*eventLoop->nevents); if (eventLoop->events == NULL || eventLoop->fired == NULL) goto err; eventLoop->setsize = setsize; eventLoop->timeEventHead = NULL; @@ -64,7 +65,7 @@ aeEventLoop *aeCreateEventLoop(int setsize) { if (aeApiCreate(eventLoop) == -1) goto err; /* Events with mask == AE_NONE are not set. So let's initialize the * vector with it. */ - for (i = 0; i < setsize; i++) + for (i = 0; i < eventLoop->nevents; i++) eventLoop->events[i].mask = AE_NONE; return eventLoop; @@ -102,20 +103,19 @@ void aeSetDontWait(aeEventLoop *eventLoop, int noWait) { * * Otherwise AE_OK is returned and the operation is successful. */ int aeResizeSetSize(aeEventLoop *eventLoop, int setsize) { - int i; - if (setsize == eventLoop->setsize) return AE_OK; if (eventLoop->maxfd >= setsize) return AE_ERR; if (aeApiResize(eventLoop,setsize) == -1) return AE_ERR; - eventLoop->events = zrealloc(eventLoop->events,sizeof(aeFileEvent)*setsize); - eventLoop->fired = zrealloc(eventLoop->fired,sizeof(aeFiredEvent)*setsize); eventLoop->setsize = setsize; - /* Make sure that if we created new slots, they are initialized with - * an AE_NONE mask. */ - for (i = eventLoop->maxfd+1; i < setsize; i++) - eventLoop->events[i].mask = AE_NONE; + /* If the current allocated space is larger than the requested size, + * we need to shrink it to the requested size. */ + if (setsize < eventLoop->nevents) { + eventLoop->events = zrealloc(eventLoop->events,sizeof(aeFileEvent)*setsize); + eventLoop->fired = zrealloc(eventLoop->fired,sizeof(aeFiredEvent)*setsize); + eventLoop->nevents = setsize; + } return AE_OK; } @@ -147,6 +147,22 @@ int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, errno = ERANGE; return AE_ERR; } + + /* Resize the events and fired arrays if the file + * descriptor exceeds the current number of events. */ + if (unlikely(fd >= eventLoop->nevents)) { + int newnevents = eventLoop->nevents; + newnevents = (newnevents * 2 > fd) ? newnevents * 2 : fd; + newnevents = (newnevents > eventLoop->setsize) ? eventLoop->setsize : newnevents; + eventLoop->events = zrealloc(eventLoop->events, sizeof(aeFileEvent) * newnevents); + eventLoop->fired = zrealloc(eventLoop->fired, sizeof(aeFiredEvent) * newnevents); + + /* Initialize new slots with an AE_NONE mask */ + for (int i = eventLoop->nevents; i < newnevents; i++) + eventLoop->events[i].mask = AE_NONE; + eventLoop->nevents = newnevents; + } + aeFileEvent *fe = &eventLoop->events[fd]; if (aeApiAddEvent(eventLoop, fd, mask) == -1) diff --git a/src/ae.h b/src/ae.h index 5f1e17f7dc7..eb97de7ab6c 100644 --- a/src/ae.h +++ b/src/ae.h @@ -79,6 +79,7 @@ typedef struct aeEventLoop { int maxfd; /* highest file descriptor currently registered */ int setsize; /* max number of file descriptors tracked */ long long timeEventNextId; + int nevents; /* Size of Registered events */ aeFileEvent *events; /* Registered events */ aeFiredEvent *fired; /* Fired events */ aeTimeEvent *timeEventHead; From afe2af63e5d2489e95ab1e34aa144b71940824c8 Mon Sep 17 00:00:00 2001 From: "debing.sun" Date: Tue, 5 Nov 2024 08:37:48 +0800 Subject: [PATCH 2/2] The size of array should be larger than fd --- src/ae.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ae.c b/src/ae.c index 6e3b7d83484..2089d86179c 100644 --- a/src/ae.c +++ b/src/ae.c @@ -152,7 +152,7 @@ int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, * descriptor exceeds the current number of events. */ if (unlikely(fd >= eventLoop->nevents)) { int newnevents = eventLoop->nevents; - newnevents = (newnevents * 2 > fd) ? newnevents * 2 : fd; + newnevents = (newnevents * 2 > fd + 1) ? newnevents * 2 : fd + 1; newnevents = (newnevents > eventLoop->setsize) ? eventLoop->setsize : newnevents; eventLoop->events = zrealloc(eventLoop->events, sizeof(aeFileEvent) * newnevents); eventLoop->fired = zrealloc(eventLoop->fired, sizeof(aeFiredEvent) * newnevents);