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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

