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 010 #define AE_READABLE 111 #define AE_WRITABLE 212 //ae框架处理两类事件,file event和time event13 #define AE_FILE_EVENTS 114 #define AE_TIME_EVENTS 215 #define AE_ALL_EVENTS (AE_FILE_EVENTS|AE_TIME_EVENTS)16 #define AE_DONT_WAIT 417 18 #define AE_NOMORE -119 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