加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
Channel.h 2.94 KB
一键复制 编辑 原始数据 按行查看 历史
leo_1 提交于 2023-10-04 11:35 . 添加channel具体实现
/***
* @Description:
* @Author: LeoTao
* @Date: 2023-10-03 22:52:32
* @LastEditTime: 2023-10-04 10:54:13
*/
#pragma once
#include "noncopyable.h"
#include "Timestamp.h"
#include <functional>
#include <memory>
/**
* 类型的前置声明,
*/
class EventLoop;
/**
* eventloop、channel、poller在reactor模型上对应Demultiplex多路事件分发器
* Channel 理解为通道,封装了sockfd和其感兴趣的event,如EPOLLIN,EPOLLOUT事件
* 还绑定了poller监听返回的具体事件
*/
class Channel : noncopyable
{
public:
//回调函数命名
using EventCallback = std::function<void()>;
using ReadEventCallback = std::function<void(Timestamp)>;
Channel(EventLoop * loop, int fd);
~Channel();
//fd得到poller通知以后,处理相应的事件
void handlerEvent(Timestamp receiveTime);
//设置回调对象
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);}
//防止当channel被手动remove掉,channel还在执行回调操作
void tie(const std::shared_ptr<void> &obj);
int fd() const {return fd_;}
int events() const {return events_;}
void set_revents(int revt){revents_ = revt;}
bool isNoneEvent() const {return events_ == kNoneEvent;}
//设置fd相应的事件状态
void enableReading(){events_ |= kReadEvent; update();}
void disableReading(){events_ &= ~kReadEvent; update();}
void enableWriteing(){events_ |= kWriteEvent; update();}
void disableWriteing(){events_ &= ~kWriteEvent; update();}
void disableAll(){events_ = kNoneEvent; update();}
//返回fd当前的事件状态
bool isNonEvent() const {return events_ == kNoneEvent;}
bool isWrite() const {return events_ & kWriteEvent;}
bool isReading() const {return events_ & kReadEvent;}
//for poller
int index() const {return index_;}
void set_index(int idx) { index_ = idx;}
EventLoop * ownerLoop(){return loop_;}
void remove();
private:
// 状态定义
static const int kNoneEvent;
static const int kReadEvent;
static const int kWriteEvent;
EventLoop *loop_;//事件循环
const int fd_; //fd,poller监听的对象
int events_; //注册fd感兴趣的事件
int revents_; //poller返回的具体发生的事件
int index_;
//监听channel是否被释放
std::weak_ptr<void> tie_;
bool tied_;
//回调函数
/**
* 因为channel通道里面能够获知fd最终发生的具体的事件revents,所以他负责调用具体事件的回调操作
*/
ReadEventCallback readCallback_;
EventCallback writeCallback_;
EventCallback closeCallback_;
EventCallback errorCallback_;
void update();
void handleEventWithGuard(Timestamp receiveTime);
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化