您的位置:首页 > 理论基础 > 数据结构算法

3.7.1 相关数据结构

2016-04-07 09:47 381 查看
事件机制的回调函数类型在event.h中定义:

/util/event.h
22 typedef void (*EVENT_NOTIFY_FN) (int, void *);
24 #define EVENT_NOTIFY_TIME_FN EVENT_NOTIFY_FN	/* legacy */
25 #define EVENT_NOTIFY_RDWR_FN EVENT_NOTIFY_FN	/* legacy */


event.c将回调函数封装成EVENT_FDTABLE结构体,并在event_init初始化函数中分配EVENT_FDTABLE结构体数组:

/util/event.c
typedef struct EVENT_FDTABLE EVENT_FDTABLE;

struct EVENT_FDTABLE {
EVENT_NOTIFY_RDWR_FN callback;
char   *context;
};


callback为回调函数。

context为挂载回调函数时的上下文(结构体)。

这是一个回调函数和环境的绑定,可以理解为一个“闭包”。

postfix定义了读、写、异常、定时四种事件:

各个类unix系统会提供不同的I/O多路复用系统调用:

/util/sys_defs.h
1387 #defineEVENTS_STYLE_SELECT     1       /* Traditional BSD select */
1388 #defineEVENTS_STYLE_KQUEUE     2       /* FreeBSD kqueue */
1389 #defineEVENTS_STYLE_DEVPOLL    3       /* Solaris /dev/poll */
1390 #defineEVENTS_STYLE_EPOLL      4       /* Linux epoll */


postfix会根据平台选择合适的I/O多路复用机制:

/util/sys_defs.h
759 #ifdefined(LINUX2) || defined(LINUX3)
822 #ifndefNO_EPOLL
823 #defineEVENTS_STYLE    EVENTS_STYLE_EPOLL      /* introduced in 2.5 */
824 #endif


我们都知道select系统调用效率不高,但这里我们不讨论各种多路复用函数实现细节,网上有大量的资料——这影响着postfix的执行效率,但不影响执行逻辑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: