Channel Class
源码阅读
欢迎交流!!!
Channel Class
封装关心的文件描述符、关心的事件和对应的处理函数。该对象的实例只能在所属的EventLoop
中被调用,所以不需要考虑线程安全问题。
数据成员
loop_
该对象的实例所在的
EventLoop
fd_
该对象关心的文件描述符
events_
该对象关心的事件
revents_
触发的事件
index_
标识,标定当前
channel
处于 未 被 监 视 、 不 关 心 事 件 , 被 监 视 未被监视、不关心事件,被监视 未被监视、不关心事件,被监视的状态。
logHup_
这是干嘛的?
std::weak_ptr<void> tie_
拥有该
Channel
的对象。问题来了,poller
那边明确提出,它及其派生类EPollPoller
和PollPoller
均不拥有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()
调用
EventLoop
的update()
,然后再去调用Poller Class
的update()
(可能不叫这个名字)
void remove()
调用
EventLoop
的remove()
,然后再去调用Poller Class
的remove()