ae.c event loop: API to resize the fd set size on the run.
This commit is contained in:
parent
e94b5b9359
commit
9281336e6b
30
src/ae.c
30
src/ae.c
@ -91,6 +91,36 @@ err:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the current set size. */
|
||||||
|
int aeGetSetSize(aeEventLoop *eventLoop) {
|
||||||
|
return eventLoop->setsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Resize the maximum set size of the event loop.
|
||||||
|
* If the requested set size is smaller than the current set size, but
|
||||||
|
* there is already a file descriptor in use that is >= the requested
|
||||||
|
* set size minus one, AE_ERR is returned and the operation is not
|
||||||
|
* performed at all.
|
||||||
|
*
|
||||||
|
* 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;
|
||||||
|
return AE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
void aeDeleteEventLoop(aeEventLoop *eventLoop) {
|
void aeDeleteEventLoop(aeEventLoop *eventLoop) {
|
||||||
aeApiFree(eventLoop);
|
aeApiFree(eventLoop);
|
||||||
zfree(eventLoop->events);
|
zfree(eventLoop->events);
|
||||||
|
2
src/ae.h
2
src/ae.h
@ -114,5 +114,7 @@ int aeWait(int fd, int mask, long long milliseconds);
|
|||||||
void aeMain(aeEventLoop *eventLoop);
|
void aeMain(aeEventLoop *eventLoop);
|
||||||
char *aeGetApiName(void);
|
char *aeGetApiName(void);
|
||||||
void aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *beforesleep);
|
void aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *beforesleep);
|
||||||
|
int aeGetSetSize(aeEventLoop *eventLoop);
|
||||||
|
int aeResizeSetSize(aeEventLoop *eventLoop, int setsize);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -55,6 +55,13 @@ static int aeApiCreate(aeEventLoop *eventLoop) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
|
||||||
|
aeApiState *state = eventLoop->apidata;
|
||||||
|
|
||||||
|
state->events = zrealloc(state->events, sizeof(struct epoll_event)*setsize);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void aeApiFree(aeEventLoop *eventLoop) {
|
static void aeApiFree(aeEventLoop *eventLoop) {
|
||||||
aeApiState *state = eventLoop->apidata;
|
aeApiState *state = eventLoop->apidata;
|
||||||
|
|
||||||
|
@ -94,6 +94,11 @@ static int aeApiCreate(aeEventLoop *eventLoop) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
|
||||||
|
/* Nothing to resize here. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void aeApiFree(aeEventLoop *eventLoop) {
|
static void aeApiFree(aeEventLoop *eventLoop) {
|
||||||
aeApiState *state = eventLoop->apidata;
|
aeApiState *state = eventLoop->apidata;
|
||||||
|
|
||||||
|
@ -54,7 +54,13 @@ static int aeApiCreate(aeEventLoop *eventLoop) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
eventLoop->apidata = state;
|
eventLoop->apidata = state;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
|
||||||
|
aeApiState *state = eventLoop->apidata;
|
||||||
|
|
||||||
|
state->events = zrealloc(state->events, sizeof(struct kevent)*setsize);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,12 @@ static int aeApiCreate(aeEventLoop *eventLoop) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
|
||||||
|
/* Just ensure we have enough room in the fd_set type. */
|
||||||
|
if (setsize >= FD_SETSIZE) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void aeApiFree(aeEventLoop *eventLoop) {
|
static void aeApiFree(aeEventLoop *eventLoop) {
|
||||||
zfree(eventLoop->apidata);
|
zfree(eventLoop->apidata);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user