ae是redis中自带的网络处理逻辑,在linux上基于epoll。
数据结构
事件基础结构
1 2 3 4 5 6 7 8 9 10 11 12 13
| /* 基于事件的程序的状态 */ typedef struct aeEventLoop { int maxfd; /*当前注册的最大的文件描述符*/ int setsize; /*允许注册文件描述符的最大数*/ long long timeEventNextId; /*下个时间事件的id*/ time_t lastTime; /*记录最后的时间,用于检测系统时钟偏移*/ aeFileEvent *events; /*文件事件集合*/ aeFireEvent *fired; /*触发事件集合*/ aeTimeEvnt *timeEventHead; /*时间事件头*/ int stop; /*是否停止状态*/ void *apidata; /*由于poll函数调用过程中参数数据*/ aeBeforeSleepProc *beforesleep; /*sleep前处理逻辑*/ } aeEventLoop;
|
文件事件结构
1 2 3 4 5 6
| typedef struct aeFileEvent { int mask; aeFileProc *rfileProc; aeFileProc *wfileProf; void *clientData; } aeFileEvent;
|
时间事件结构
1 2 3 4 5 6 7 8
| typedef struct aeTimeEvent { long long id; long when_sec; long when_ms; aeTimeProc *timeProc; aeEventFinalizerProc *finalizerZProc; void *clientData; };
|
触发事件结构
1 2 3 4
| typedef struct aeFiredEvent { int fd; int mask; };
|
常量定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #define AE_OK 0 #define AE_ERR -1
#define AE_NONE 0 #define AE_READABLE 1 #define AE_WRITEABLE 2
#define AE_FILE_EVENTS 1 #define AE_TIME_EVENTS 2 #define AE_ALL_EVENTS (AE_FILE_EVENTS | AE_TIME_EVENTS) #define AE_DONT_WAIT 4
#define AE_NOMORE -1 #define AE_DELETED_EVENT_ID -1
|
宏定义
1 2
| #define AE_NOTUSED(V) ((void) V)
|
函数指针定义
1 2 3 4 5 6 7 8
| typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);
typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *clientData);
typedef void aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData);
typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop);
|
函数原型
aeCreateEventLoop
1 2 3 4 5 6 7 8
| /** * title: 创建eventLoop结构 * param: * setsize 事件初始大小 * return: * aeEventLoop 事件指针 */ aeEventLoop *aeCreateEventLoop(int setsize);
|
aeDeleteEventLoop
1 2 3 4 5 6 7 8
| /** * title: 删除eventLoop结构 * param: * eventLoop eventLoop指针 * return: * void */ void aeDeleteEventLoop(aeEventLoop *eventLoop);
|
aeStop
1 2 3 4 5 6 7 8
| /** * title: 停止eventLoop * param: * eventLoop eventLoop指针 * return: * void */ void aeStop(aeEventLoop *eventLoop);
|
aeCreateFileEvent
1 2 3 4 5 6 7 8 9 10 11 12
|
int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, aeFileProc *proc, void *clientData);
|
aeDeleteFileEvent
1 2 3 4 5 6 7 8 9 10
| /** * title: 创建eventLoop结构 * param: * eventLoop eventLoop指针 * fd 文件描述符 * mask 掩码 * return: * aeEventLoop 事件对象 */ void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask);
|
aeGetFileEvents
1 2 3 4 5 6 7 8 9
| /** * title: 获取文件事件的标志位 * param: * eventLoop eventLoop指针 * fd 文件描述符 * return: * mask 事件的标志mask(读、写、读+写、其他) */ int aeGetFileEvents(aeEventLoop *eventLoop, int fd);
|
aeCreateTimeEvent
1 2 3 4 5 6 7 8 9 10 11 12
|
long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds, aeTimeProc *proc, void *clientData, aeEventFinalizerProc *finalizerProc);
|
aeDeleteTimeEvent
1 2 3 4 5 6 7 8 9
|
int aeDeleteTimeEvent(aeEventLoop *eventLoop, long long id);
|
aeProcessEvents
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| /** * title: 处理eventLoop中的文件描述符事件和时间事件 * param: * eventLoop eventLoop指针 * flags 标识符 * 0 直接返回 * AE_ALL_EVENTS 处理所有的事件 * AE_FILE_EVENTS 处理文件描述符事件 * AE_TIME_EVENTS 处理时间事件 * AE_DONT_WAIT 处理事件, 而不需要等待 * return: * int 返回处理的事件对象数目 */ int aeProcessEvents(aeEventLoop *eventLoop, int flags);
|
aeWait
1 2 3 4 5 6 7 8 9 10
|
int aeWait(int fd, int mask, long long milliseconds);
|
aeMain
1 2 3 4 5 6 7 8
| /** * title: eventLoop的入口 * param: * eventLoop eventLoop指针 * return: * void */ void aeMain(aeEventLoop *eventLoop);
|
aeGetApiName
1 2 3 4 5 6 7 8
| /** * title: 获取当前使用的实现方式,比如(select,epoll,kqueue,evport) * param: * void * return: * void */ char * aeGetApiName(void);
|
aeSetBeforeSleepProc
1 2 3 4 5 6 7 8 9
| /** * title: 设置eventLoop sleep前的函数指针 * param: * eventLoop eventLoop指针 * proc 函数指针 * return: * void */ void aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *proc);
|
aeGetSetSize
1 2 3 4 5 6 7 8
| /** * title: 获取eventLoop的文件描述符大小 * param: * eventLoop eventLoop指针 * return: * int 当前eventLoop的描述符大小 */ int aeGetSetSize(aeEventLoop *eventLoop);
|
aeResizeSetSize
1 2 3 4 5 6 7 8 9
| /** * title: 重设eventLoop的文件描述符大小 * param: * eventLoop eventLoop指针 * setsize 集合大小 * return: * int 操作结果AE_OK | AE_ERR */ int aeResizeSetSize(aeEventLoop *eventLoop, int setsize);
|