muduo网络库源码解析 三
来源:互联网 发布:努比亚专业相机软件 编辑:程序博客网 时间:2024/05/21 22:51
这一节我们来解析Reactor最核心的事件分发机制——Channel和Poller。每个Channel对象只属于一个EventLoop,因此每个Channel对象都只属于一个IO线程,并且只负责一个文件描述符,但是并不拥有这个fd,也不会在析构的时候关闭这个fd。首先来看一下构造函数原型Channel(EventLoop *loop, int fd);很明显,需要说明所属EventLoop,以及负责的文件描述符fd
事件类型的定义:
const int Channel::kNoneEvent = 0;const int Channel::kReadEvent = POLLIN | POLLPRI;const int Channel::kWriteEvent = POLLOUT;
事件处理函数:
void Channel::handleEvent(){ eventHandling_ = true; if (revents_ & POLLNVAL) { LOG_WARN << "Channel::handle_event() POLLNVAL"; } if ((revents_ & POLLHUP) && !(revents_ & POLLIN)) { LOG_WARN << "Channel::handle_event() POLLHUP"; if (closeCallback_) closeCallback_(); } if (revents_ & (POLLERR | POLLNVAL)) { if (errorCallback_) errorCallback_(); } if (revents_ & (POLLIN | POLLPRI | POLLRDHUP)) { if (readCallback_) readCallback_(); } if (revents_ & POLLOUT) { if (writeCallback_) writeCallback_(); } eventHandling_ = false;}update和disableAll用来注册和注销,其中update会调用EventLoop的updateChannel函数,disableAll 会将events设置为kNoneEvent.
Poller是对IO multiplexing的封装,在muduo中是个抽象基类,因为同时支持poll和epoll两种IO复用方式,和Channel类似,只属于一个EventLoop,只供其owner EventLoop在IO线程调用,所以无需加锁。我们先来看两个成员变量的类型:
typedef std::vector<pollfd> PollfdList;typedef std::map<int, Channel*> ChannelMap;PollfdList pollfds_;ChannelMap channels_;PollfdList是一个vector,保存着pollfd,ChannelMap是一个map,保存着Channel*。key为fd,value为Channel*。Channel的index为在pollfds_中的下标。
updateChannel用来注册和修改channel,removeChannel用来注销channel。
阅读全文
0 0
- muduo网络库源码解析 三
- muduo网络库源码解析 一
- muduo网络库源码解析 二
- muduo网络库源码解析 四
- muduo网络库源码解析 五
- muduo网络库源码解析 六
- muduo网络库源码解析 七
- muduo网络库源码分析-定时器
- muduo源码解析之TcpConnection
- muduo源码解析之EventLoopThread
- Muduo之Channel源码解析
- Muduo网络库源码分析(三)线程间使用eventfd通信和EventLoop::runInLoop系列函数
- Muduo网络库源码分析(三)线程间使用eventfd通信和EventLoop::runInLoop系列函数
- muduo网络库之net库源码分析(1)
- muduo库源码解析:单例模式singleton
- muduo网络库源码学习————互斥锁
- Muduo 网络库源码分析 之 关键技术点总结
- Muduo 网络库源码分析 之 关键技术点总结
- ORA-29275:部分多字节字符
- 数据库优化总结
- odoo10.0 网站建立
- LINUX学习笔记二(常用指令)
- 关于c语言中fread和fwrite的使用
- muduo网络库源码解析 三
- 厨房单品
- yii2 中获取 模块、控制器、方法名的方法
- 【Linux 命令操作】Linux中常用操作命令和快捷键
- js jquery 前端 操作大全(常用)
- json与序列化pickling
- H.265和H.264对比分析(VR视频传输)
- MNIST的AlexNet实现
- java中final关键字