muduo網絡庫代碼剖析——Channel類


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_有事件到來以后回調上層的函數

 

三、提升對象生命期???

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM