PollPoller Class详解/源码阅读(muduo/net/poller)

PollPoller Class详解/源码阅读(muduo/net/poller

@(如有问题欢迎交流)

PollPoller Class是基于poll(2) I / O 复 用 I/O复用 I/O具体类,以Poller Class为基类。

数据成员

  • EventLoop* ownerLoop_

继承于基类,通过构造函数初始化

  • std::map<int, Channel*> channels_

继承于基类

  • std::vector<struct pollfd> pollfds_

基于Channel初始化的pollfd类型的容器

函数成员

  • PollPoller

构造函数,只负责初始化ownerLoop_

  • Timestamp poll(int timeoutMs, ChannelList* activeChannels)

1 调用poll监听就绪事件
2 将就绪事件填入activeChannels(fillActiveChannels)

  • void fillActiveChannels(int numEvents,ChannelList* activeChannels) const;

遍历pollfds_,将就绪事件的Channel填入activeChannels
1 对于pollfds_中的每一项检查pollfd::revents是否大于0
2 如果满足pollfd::revents大于0,就根据pollfd::fdchannels_中寻找Channel。并将其填入activeChannels

  • void updateChannel(Channel* channel)

添加or更新channel
1 如果是添加(channel::index<0
2 首先检查channel不存在于channels_
3 为channel创建pollfd数据,并保存到pollfds_
4 设置channelidx为其在pollfds_中的下标
5 最后将channel保存到channels_


1 如果是更新
2 首先检查channel是否存在于channels_
3 检查Channel::idx是否有效
4 检查文件描述符是否有效
5 修改监视事件
6 如果暂时不关心监视的事件,就修改pollfds_对应项的文件描述符

  • void removeChannel(Channel* channel)

移除channel
1 移除时,需要确认channel不再关心监视的事件(Channel::isNoneEvent==true)
2 从channels_中剔除channel
3 如果channel是最后一个,则直接从pollfds_中剔除
4 如果不是,则交换最后一个和channel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值