ae网络库

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; /*标识位 AE_READABLE | AE_WRITEABLE 之一*/
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
/*操作码定义*/
#define AE_OK 0 /*操作正确*/
#define AE_ERR -1 /*操作失败*/
/*文件读写标志定义*/
#define AE_NONE 0 /*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
/*不使用,目前redis中没有用到*/
#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);
/*sleep前处理函数*/
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
/**
* title: 创建文件描述符事件
* param:
* eventLoop eventLoop指针
* fd 文件描述符
* mask 掩码
* proc 文件处理函数指针
* clientData 附加数据
* return:
* int 操作结果
*/
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
/**
* title: 创建eventLoop结构
* param:
* eventLoop eventLoop指针
* milliseconds 毫秒
* proc 处理函数指针
* clientData 附加数据
* finalizerProc 结束处理函数指针
* return:
* long long 返回的事件编号
*/
long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds, aeTimeProc *proc, void *clientData, aeEventFinalizerProc *finalizerProc);

aeDeleteTimeEvent

1
2
3
4
5
6
7
8
9
/**
* title: 删除时间事件
* param:
* eventLoop eventLoop指针
* id 要删除的事件编号
* return:
* int 操作结果 AE_OK | AE_ERR
*/
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
/**
* title: 等待指定描述符上发生的事件
* param:
* fd 文件描述符
* mask 掩码
* milliseconds超时时间毫秒
* return:
* int 事件标识符(AE_READABLE | AE_WRITEABLE | EXCEPTION)
*/
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);
文章目录
  1. 1. 数据结构
    1. 1.1. 事件基础结构
    2. 1.2. 文件事件结构
    3. 1.3. 时间事件结构
    4. 1.4. 触发事件结构
    5. 1.5. 常量定义
    6. 1.6. 宏定义
    7. 1.7. 函数指针定义
  2. 2. 函数原型
    1. 2.1. aeCreateEventLoop
    2. 2.2. aeDeleteEventLoop
    3. 2.3. aeStop
    4. 2.4. aeCreateFileEvent
    5. 2.5. aeDeleteFileEvent
    6. 2.6. aeGetFileEvents
    7. 2.7. aeCreateTimeEvent
    8. 2.8. aeDeleteTimeEvent
    9. 2.9. aeProcessEvents
    10. 2.10. aeWait
    11. 2.11. aeMain
    12. 2.12. aeGetApiName
    13. 2.13. aeSetBeforeSleepProc
    14. 2.14. aeGetSetSize
    15. 2.15. aeResizeSetSize