|
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 |
|
|