3.7.3 event_enable_read和event_enable_write:挂载回调函数
来源:互联网 发布:怎么用jquery遍历数组 编辑:程序博客网 时间:2024/06/01 13:34
这两个函数将指定文件描述符的read和write事件相应的回调函数挂载到EVENT_FDTABLE结构体的callback字段中,下面以event_enable_read为例来介绍:
/util/event.c729 void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context) 730 { 731 const char *myname = "event_enable_read"; 732 EVENT_FDTABLE *fdp; 733 int err; 734 735 if (EVENT_INIT_NEEDED()) 736 event_init();
735-736没有运行event_init的话运行event_init。
737 738 /* 739 * Sanity checks. 740 */ 741 if (fd < 0 || fd >= event_fdlimit) 742 msg_panic("%s: bad file descriptor: %d", myname, fd);
741-742 验证fd合规性,小于0或超过event_fdlimit限制程序退出。postfix的代码中遍布着“Sanitychecks”。
743 744 if (msg_verbose > 2) 745 msg_info("%s: fd %d", myname, fd); 746 747 if (fd >= event_fdslots) 748 event_extend(fd);
747-748 如果fd大于现有EVENT_FDTABLE数组个数,对其扩容。event_extend使用myremalloc函数对EVENT_FDTABLE数组扩容。新数组的个数按如下原则设置:如果现有的event_fdslots数目大于要监听的fd数目的一半,则将新的event_fdslots数目设置为原数目两倍,否则将新的event_fdslots数目数目增加EVENT_ALLOC_INCR。
749 750 /* 751 * Disallow mixed (i.e. read and write) requests on the same descriptor. 752 */ 753 if (EVENT_MASK_ISSET(fd, &event_wmask)) 754 msg_panic("%s: fd %d: read/write I/O request", myname, fd);
753-754 该fd不能在写文件描述符组中。同样,对于event_enable_write,则fd不能在读文件描述符组中。
755 756 /* 757 * Postfix 2.4 allows multiple event_enable_read() calls on the same 758 * descriptor without requiring event_disable_readwrite() calls between 759 * them. With kernel-based filters (kqueue, /dev/poll, epoll) it's 760 * wasteful to make system calls when we change only application 761 * call-back information. It has a noticeable effect on smtp-source 762 * performance. 763 */ 764 if (EVENT_MASK_ISSET(fd, &event_rmask) == 0) { 765 EVENT_MASK_SET(fd, &event_xmask); 766 EVENT_MASK_SET(fd, &event_rmask);767 if (event_max_fd < fd) 768 event_max_fd = fd;
764-768 如果文件描述符不在event_rmask中,将其加入到event_rmask和event_xmask中,视情况重置event_max_fd。
769 #if (EVENTS_STYLE != EVENTS_STYLE_SELECT) 770 EVENT_REG_ADD_READ(err, fd); 771 if (err < 0) 772 msg_fatal("%s: %s: %m",myname, EVENT_REG_ADD_TEXT); 773 #endif 774 } 775 fdp = event_fdtable + fd; 776 if (fdp->callback != callback || fdp->context != context) { 777 fdp->callback = callback; 778 fdp->context = context; 779 }
775-778 将EVENT_FDTABLE数组中EVENT_FDTABLE成员的回调函数字段设置为相应的回调函数,上下文结构体字段设置为相应的上下文结构体。EVENT_FDTABLE结构体按fd索引。
0 0
- 3.7.3 event_enable_read和event_enable_write:挂载回调函数
- 回调函数和委托
- 委托和回调函数
- 回调函数和枚举
- 计时器和回调函数
- 闭包性和回调函数
- AJAX和回调函数
- 回调函数、消息和事件例程
- 回调函数、消息和事件例程
- 函数指针和回调函数浅学
- 函数指针和回调函数
- java和javascript中的回调函数
- 回调函数和函数指针
- 函数指针和回调函数
- 回调函数和钩子函数
- 回调函数、模板和Ioc
- 钩子函数和回调函数
- 字体枚举和回调函数。
- Android Studio debug使用release的签名
- 神经网络基本概念
- 【笔试/面试】 —— 最长递增子序列
- 分类模型到底如何选择
- iOS开发学习之 - 正则表达式在IOS中的应用
- 3.7.3 event_enable_read和event_enable_write:挂载回调函数
- Python函数参数默认值的陷阱和原理深究
- 部署两个tomcat后,系统提示cannot set user id: Resource temporarily unavailable
- 即兴人生——来吧,把你的五声音阶运用起来!
- 动态库的链接和链接选项-L,-rpath-link,-rpath
- 随机生成不同的随机数
- github desktop for mac 上传项目步骤以及注意事项
- ViewCompat.animate的用法和点击萎缩动画效果
- iOS开发设置单独界面无横屏