设为首页 收藏本站
查看: 954|回复: 0

[经验分享] redis源码笔记-ae.h

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-21 07:48:48 | 显示全部楼层 |阅读模式
  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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88823-1-1.html 上篇帖子: 基于redis分布式缓存实现(新浪微博案例) 下篇帖子: C# Redis Server分布式缓存编程(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表