加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Channel.h 3.81 KB
一键复制 编辑 原始数据 按行查看 历史
#pragma once
#include "noncopyable.h"
#include "Timestamp.h"
#include <functional>
#include <memory>
class EventLoop;
/*
* Channel理解为通道,封装了socketfd和其感兴趣的event,如EPOLLIN和EPOLLOUT事件
* 还绑定了Poller对象所返回的具体事件
* 要理清楚 EventLoop、Channel、Poller之间的关系,实际上它们就对应 Reactor 模型上的 Demultiplex 事件分发器
*/
class Channel:noncopyable{
public:
using EventCallback = std::function<void()>; //事件回调
using ReadEventCallback = std::function<void(Timestamp)>; //只读事件的回调
Channel(EventLoop* loop,int fd);
~Channel();
//fd得到Poller通知以后,调用相应的回调函数处理事件
void handleEvent(Timestamp recevieTime);
//设置回调函数对象
void setReadCallback(ReadEventCallback cb){
//cb是个局部对象,函数结束后就会被释放
//因此直接使用move将其变为左值会得到效率的提升
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);
}
//防止当channel被手动remove掉,channel还在执行回调操作
void tie(const std::shared_ptr<void>&);
//返回fd
int fd() const {
return fd_;
}
//返回fd所感兴趣的事件
int events() const {
return events_;
}
void set_revents(int revt){
revents_ = revt;
}
//设置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();
}
//返回fd当前的事件状态
bool isNoneEvent() const {
return events_ == kNoneEvent;
}
bool isWriting() const {
return events_ & kWriteEvent;
}
bool isReading() const {
return events_ & kReadEvent;
}
//for Poller
int index() { return index_; }
void set_index(int idx){ index_ = idx; }
//one loop per thread
//返回当前Channel所属的loop对象
EventLoop* ownerLoop(){ return loop_; }
//删除channel
void remove();
private:
void update(); //更新epoll树上所监听fd的状态
void handleEventWithGuard(Timestamp receiveTime); //受保护的事件处理
//表示sockfd的状态
static const int kNoneEvent; //sockfd不对任何事件感兴趣
static const int kReadEvent; //sockfd对读事件感兴趣
static const int kWriteEvent; //sockfd对写事件感兴趣
EventLoop* loop_; //事件循环
const int fd_; //fd,Poller监听的对象
int events_; //注册fd感兴趣的事件
int revents_; //Poller返回的具体发生的事件
int index_; //Poller需要使用的
//在多线程中使用weak_ptr来监听它所观察的资源生存状态
//使用的时候可以把弱智能指针提升成强智能指针,提升成功则访问,提升失败则不访问
//说明资源已经被释放掉了,使用shared_from_this也可以得到相同的效果
std::weak_ptr<void> tie_;
bool tied_;
//因为Channel通道里能够获知fd最终发生的具体的事件revents
//所以它负责调用具体事件的回调操作
ReadEventCallback readCallback_;
EventCallback writeCallback_;
EventCallback closeCallback_;
EventCallback errorCallback_;
};
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化