ae框架是redis作者开发的事件处理框架,其目的和libevent项目类似。redis本着最小依赖原则,自己实现了一套,而且速度更快。ae只有不到500行代码,但据说libevent有3万加的代码,实现这一个功能所付出的代码量已经超过了redis所有的代码量。
ae.h
1
#ifndef __AE_H__
2
#define
__AE_H__
3
//同时支持的连接数,其实这个还是可以设的更大一些
4
#define
AE_SETSIZE (1024*10) /* Max number of fd supported */
5
6
#define
AE_OK 0
7
#define
AE_ERR -1
8
9
#define
AE_NONE 0
10
#define
AE_READABLE 1
11
#define
AE_WRITABLE 2
12
//ae框架处理两类事件,file event和time event
13
#define
AE_FILE_EVENTS 1
14
#define
AE_TIME_EVENTS 2
15
#define
AE_ALL_EVENTS (AE_FILE_EVENTS|AE_TIME_EVENTS)
16
#define
AE_DONT_WAIT 4
17
18
#define
AE_NOMORE -1
19
20
/*
Macros
*/
21
#define
AE_NOTUSED(V) ((void) V)
22
23
struct
aeEventLoop;
24
//为方便使用定义的函数指针别名
25
/*
Types and data structures
*/
26
typedef
void
aeFileProc(
struct
aeEventLoop *eventLoop,
int
fd,
void
*clientData,
int
mask);
27
typedef
int
aeTimeProc(
struct
aeEventLoop *eventLoop,
long
long
id,
void
*
clientData);
//这个函数类似于析构函数,在event删除前调用
28
typedef
void
aeEventFinalizerProc(
struct
aeEventLoop *eventLoop,
void
*
clientData);
29
typedef
void
aeBeforeSleepProc(
struct
aeEventLoop *
eventLoop);
30
//文件事件结构,是一个数组
31
/*
File event structure
*/
32
typedef
struct
aeFileEvent {
33
int
mask;
/*
one of AE_(READABLE|WRITABLE)
*/
34
aeFileProc *
rfileProc;
35
aeFileProc *
wfileProc;
36
void
*
clientData;
37
} aeFileEvent;
38
//时间事件结构,是一个链表
39
/*
Time event structure
*/
40
typedef
struct
aeTimeEvent {
41
long
long
id;
/*
time event identifier.
*/
42
long
when_sec;
/*
seconds
*/
43
long
when_ms;
/*
milliseconds
*/
44
aeTimeProc *
timeProc;
45
aeEventFinalizerProc *
finalizerProc;
46
void
*
clientData;
47
struct
aeTimeEvent *
next;
48
} aeTimeEvent;
49
//表示即将执行的事件
50
/*
A fired event
*/
51
typedef
struct
aeFiredEvent {
52
int
fd;
53
int
mask;
54
} aeFiredEvent;
55
56
/*
State of an event based program
*/
57
typedef
struct
aeEventLoop {
58
int
maxfd;
59
long
long
timeEventNextId;
60
aeFileEvent events[AE_SETSIZE];
/*
Registered events
*/
61
aeFiredEvent fired[AE_SETSIZE];
/*
Fired events
*/
62
aeTimeEvent *
timeEventHead;
63
int
stop;
64
void
*apidata;
/*
This is used for polling API specific data
*/
65
aeBeforeSleepProc *
beforesleep;
66
} aeEventLoop;
67
68
/*
Prototypes
*/
69
aeEventLoop *aeCreateEventLoop(
void
);
70
void
aeDeleteEventLoop(aeEventLoop *
eventLoop);
71
void
aeStop(aeEventLoop *
eventLoop);
72
int
aeCreateFileEvent(aeEventLoop *eventLoop,
int
fd,
int
mask,
73
aeFileProc *proc,
void
*
clientData);
74
void
aeDeleteFileEvent(aeEventLoop *eventLoop,
int
fd,
int
mask);
75
int
aeGetFileEvents(aeEventLoop *eventLoop,
int
fd);
76
long
long
aeCreateTimeEvent(aeEventLoop *eventLoop,
long
long
milliseconds,
77
aeTimeProc *proc,
void
*
clientData,
78
aeEventFinalizerProc *
finalizerProc);
79
int
aeDeleteTimeEvent(aeEventLoop *eventLoop,
long
long
id);
80
int
aeProcessEvents(aeEventLoop *eventLoop,
int
flags);
81
int
aeWait(
int
fd,
int
mask,
long
long
milliseconds);
82
void
aeMain(aeEventLoop *
eventLoop);
83
char
*aeGetApiName(
void
);
84
void
aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *
beforesleep);
85
86
#endif

