Channel類的數據成員
public: //兩個可調用對象的類型別名 typedef std::function<void()> EventCallback; typedef std::function<void(Timestamp)> ReadEventCallback; private: //事件:POLLIN、POLLPRI、POLLOUT static const int kNoneEvent; static const int kReadEvent; static const int kWriteEvent; //這個Channel所屬於哪個EventLoop對象指針 EventLoop* loop_; //關注這個文件描述符 const int fd_; //這個Channel注冊關注了哪些事件:POLLIN、POLLPRI、POLLOUT等的組合 int events_; //當前激活的事件:POLLIN、POLLPRI、POLLOUT等的組合 int revents_; // it's the received event types of epoll or poll //在子類PollPoller類中:index代表輪詢的fd數組的下標 //在子類EpollPoller類中:index代表三種狀態:kNew(新的fd未被添加到epoll關注列表內)、kAdded(已添加)、kDeleted(已刪除) int index_; // used by Poller. //???? bool logHup_; //???? std::weak_ptr<void> tie_; //???? bool tied_; //正在執行Channel的回調函數 bool eventHandling_; //Channel的文件描述符fd,或者說是否被添加進關注列表 bool addedToLoop_; //fd所屬的Channel有事件到來調用的回調函數,由更上一層賦值 ReadEventCallback readCallback_; EventCallback writeCallback_; EventCallback closeCallback_; EventCallback errorCallback_;
Channel類的作用
1.存儲了當fd_有事件到來以后需要回調上層的函數:readCallback_、writeCallback_、closeCallback_、errorCallback_
2.提升了某個對象的生命期??
3.將fd_(或者說Channel)添加到EventLoop的poll的關注列表里面。
一、將fd_(或者說Channel)添加(/刪除/修改)到EventLoop的poll的關注列表里面
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; }
void Channel::update() { addedToLoop_ = true; loop_->updateChannel(this); }
最終其實調用的是Channel對象所屬的EventLoop對象的updateChannel()函數。
流程圖:
Channel對象並不擁有這個文件描述符fd,不會在析構對象的時候關閉文件描述符fd。
Channel會把不同的IO事件(監聽可讀或者可寫)分發為不同的回調。
二、當fd_有事件到來以后回調上層的函數
三、提升對象生命期???