redis源码笔记-ae.h
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架