Channel Class详解&源码阅读

本文详细介绍了ChannelClass的源码实现,包括其关注的文件描述符、事件及处理函数等核心成员变量,以及构造函数、事件设置与回调函数设置等关键方法。ChannelClass主要负责在EventLoop中注册和管理I/O事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Channel Class源码阅读

欢迎交流!!!

Channel Class封装关心的文件描述符、关心的事件和对应的处理函数。该对象的实例只能在所属的EventLoop中被调用,所以不需要考虑线程安全问题。

数据成员

  • loop_

该对象的实例所在的EventLoop

  • fd_

该对象关心的文件描述符

  • events_

该对象关心的事件

  • revents_

触发的事件

  • index_

标识,标定当前channel处于未被监视、不关心事件,被监视未被监视、不关心事件,被监视的状态。

  • logHup_

这是干嘛的?

  • std::weak_ptr<void> tie_

拥有该Channel的对象。问题来了,poller那边明确提出,它及其派生类EPollPollerPollPoller均不拥有Channel,那谁拥有Channel呢?

  • bool tied_

当前Channel是否被拥有

  • evntHandling_

当前Channel是否有事件正被处理

  • addedToLoop_

当前Channel是否被监视

  • ReadEventCallback readCallback_; EventCallback writeCallback_; EventCallback closeCallback_; EventCallback errorCallback_;

读/写/断/错相应的处理函数

函数成员

  • Channel(EventLoop* loop, int fd)

构造函数,对数据成员执行初始化

  • void enableReading() { events_ |= kReadEvent; update(); } void disableReading() { events_ &= ~kReadEvent; update(); } void enableWriting() { events_ |= kWriteEvent; update(); } void disableWriting() { events_ &= ~kWriteEvent; update(); } void disableAll() { events_ = kNoneEvent; update(); } bool isWriting() const { return events_ & kWriteEvent; } bool isReading() const { return events_ & kReadEvent; }

设置or关闭关心的事件,或者确定事件是否有被关心

  • void setReadCallback(ReadEventCallback cb) { readCallback_ = std::move(cb); } void setWriteCallback(EventCallback cb) { writeCallback_ = std::move(cb); } void setCloseCallback(EventCallback cb) { closeCallback_ = std::move(cb); } void setErrorCallback(EventCallback cb) { errorCallback_ = std::move(cb); }

设置相应的事件处理函数,但是move的功能我不太懂

  • void handleEvent(Timestamp receiveTime);

根据发生的事件调用响应的事件处理函数(void handleEventWithGuard(Timestamp receiveTime)),在调用前要检查是否绑定到某一个对象上。

  • void tie(const std::shared_ptr<void>&)

将当前Channel绑定到一个对象上

  • bool isNoneEvent() const { return events_ == kNoneEvent; }

Poller Class那边时常提起的Channel::isNoneEvent()的判断依据是Channel::events_,即没有关心的事件。

  • void update()

调用EventLoopupdate(),然后再去调用Poller Classupdate()(可能不叫这个名字)

  • void remove()

调用EventLoopremove(),然后再去调用Poller Classremove()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值