4242 #endif
4343#endif
4444
45-
45+ #define INITIAL_EVENT 32
4646aeEventLoop * 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. */
104105int 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 )
0 commit comments