1. 说明
- 一个Channel类, 是selectable IO channel,负责注册与响应IO事件,它不拥有file descriptor.它是Acceptor,Connector,EventLoop,TimeQueue,TcpConnection的成员,生命周期由后者控制
2. 变量
-
类型定义
- EventCallback
- ReadEventCallback,两种不同的回调函数
-
static const int kNoneEvent;
-
static const int kReadEvent;
-
static const int kWriteEvent;
- 几种poll关注事件的定义
-
EventLoop* loop_;
- 不解释
-
const int fd_;
- 文件描述符,构造函数中指定
-
int events_;
-
int revents_; // it’s the received event types of epoll or poll
- poll关注事件的种类,是POLLIN|POLLPRI还是POLLOUT还是0,revnets_是pollfd结构的revents,这里需要知道关于poll()的知识
-
int index_; // used by Poller.
- 对于PollPoller要用,小于0表示是一个新的Channel,还没加入poll关注,否则是更新一个存在的Channel
- 对于EPollPoller,有三种:-1,1,2,分别表示新的,已添加,已删除
-
bool logHup_;
- 如果有POLLHUP事件,是否要打印日志,POLLHUP是当socket的另一端关闭时,或读到文件结尾,会收到pollhup事件
-
std::weak_ptr tie_;
- 这个要结合TcpConenction理解,在那个文件中有说明
-
bool tied_;
- 如上
-
bool eventHandling_;
- 是否处于处理事件的过程中,即是否是handleEventWithGuard()函数调用过程中
-
bool addedToLoop_;
- 判断当前channel是否加入事件关注
-
ReadEventCallback readCallback_;
-
EventCallback writeCallback_;
-
EventCallback closeCallback_;
-
EventCallback errorCallback_;
- 几个回调函数
3. 函数
1. 私有
-
static string eventsToString(int fd, int ev);
- 返回关注事件的字符串格式
-
void update();
- 调用loop_的updateChannel(this),改变通道信息
-
void handleEventWithGuard(Timestamp receiveTime);
- 对应的poll事件选择相应的回调函数进行执行
2. 公有
-
构造
- 各成员初始化
-
析构
- 确保当前通道已经被其他对象销毁
-
set/get系列
- void setReadCallback(ReadEventCallback cb)
- void setWriteCallback(EventCallback cb)
- void setCloseCallback(EventCallback cb)
- void setErrorCallback(EventCallback cb)
- void set_revents(int revt)
- int fd()
- int events()
- int index()
- void set_index(int idx)
- 如名,没有set的一般就是get
-
void tie(const std::shared_ptr&);
- 在TcpConnection中使用,那个文件中有说明
-
bool isNoneEvent() const
- 看events_是否为0
-
对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; }
-
string reventsToString() const;
-
string eventsToString() const;
- 这两个是调试用的,都是调用私有的eventsToString(int fd, int ev),返回关注事件的字符串格式
-
void doNotLogHup()
- 设置logHup_为false
-
EventLoop* ownerLoop()
- 返回channel所属的EventLoop
-
void remove();
- 从loop_中移除此通道