1 long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds,
2 aeTimeProc *proc, void *clientData,
3 aeEventFinalizerProc *finalizerProc)
4 {
5 long long id = eventLoop->timeEventNextId++;
6 aeTimeEvent *te;
7
8 te = zmalloc(sizeof(*te));
9 if (te == NULL) return AE_ERR;
10 te->id = id;
11 aeAddMillisecondsToNow(milliseconds,&te->when_sec,&te->when_ms);
12 te->timeProc = proc;
13 te->finalizerProc = finalizerProc;
14 te->clientData = clientData;
15 te->prev = NULL;
16 te->next = eventLoop->timeEventHead;
17 if (te->next)
18 te->next->prev = te;
19 eventLoop->timeEventHead = te;
20 return id;
21 }
static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
aeApiState *state = eventLoop->apidata;
if (mask & AE_READABLE) FD_SET(fd,&state->rfds);
if (mask & AE_WRITABLE) FD_SET(fd,&state->wfds);
return 0;
}
int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,
aeFileProc *proc, void *clientData)
{
if (fd >= eventLoop->setsize) {
errno = ERANGE;
return AE_ERR;
}
aeFileEvent *fe = &eventLoop->events[fd];
if (aeApiAddEvent(eventLoop, fd, mask) == -1)
return AE_ERR;
fe->mask |= mask;
if (mask & AE_READABLE) fe->rfileProc = proc;
if (mask & AE_WRITABLE) fe->wfileProc = proc;
fe->clientData = clientData;
if (fd > eventLoop->maxfd)
eventLoop->maxfd = fd;
return AE_OK;
}
执行完initServer及aeSetBeforeSleepProc和aeSetAfterSleepProc函数设置好全局变量server后,进程调用aeMain函数进入循环,开始接收客户端连接和命令交互。aeMain(ae.c)函数源码如下:
1 //处理客户端命令的主函数,由main函数调用,aeEventLoop定义在(ae.h),beforesleep和aftersleep均在服务器启动初始化时设定
2 void aeMain(aeEventLoop *eventLoop) {
3 eventLoop->stop = 0;
4 while (!eventLoop->stop) {
5 if (eventLoop->beforesleep != NULL)
6 eventLoop->beforesleep(eventLoop);
7 //处理文件时间及时间事件
8 aeProcessEvents(eventLoop, AE_ALL_EVENTS|AE_CALL_AFTER_SLEEP);
9 }
10 }