加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
Channel.cpp 2.09 KB
一键复制 编辑 原始数据 按行查看 历史
leo_1 提交于 2023-10-10 22:21 . eventloop实现完成
/***
* @Description:
* @Author: LeoTao
* @Date: 2023-10-03 22:52:37
* @LastEditTime: 2023-10-09 22:13:17
*/
#include "Channel.h"
#include "EventLoop.h"
#include "logger.h"
#include <sys/epoll.h>
const int Channel::kNoneEvent = 0;
const int Channel::kReadEvent = EPOLLIN | EPOLLPRI;
const int Channel::kWriteEvent = EPOLLOUT;
//EventLoop : ChannelList Poller
Channel::Channel(EventLoop * loop, int fd)
:loop_(loop),
fd_(fd),
events_(0),
revents_(0),
index_(-1),
tied_(false){}
Channel::~Channel(){}
void Channel::tie(const std::shared_ptr<void> &obj){
tie_ = obj;
tied_ = true;
}
//当改变channel所表示fd的event事件之后,update负责在poller里面更改fd相应的事件epoll_ctl
void Channel::update(){
//通过channel所属的EventLoop,调用poller的相应方法,注册fd的events事件
loop_->updateChannel(this);
}
//在channel所属的Eventloop中,把当前的channel删除掉
void Channel::remove(){
loop_->removeChannel(this);
}
// fd得到poller通知以后,处理相应的事件
void Channel::handlerEvent(Timestamp receiveTime){
std::shared_ptr<void> guard;
if(tied_){
guard = tie_.lock();
//如果绑定过了
if(guard){
handleEventWithGuard(receiveTime);
}
} else {
//没有绑定
handleEventWithGuard(receiveTime);
}
}
//根据poller通知的channel发生的具体事件,由channel负责调用具体的回调操作
void Channel::handleEventWithGuard(Timestamp receiveTime){
LOG_INFO("channel handlerEvent revents:%d", revents_);
if((revents_ & EPOLLHUP) && !(revents_ & EPOLLIN)){
//发生异常
if(closeCallback_){
closeCallback_();
}
}
if(revents_ & EPOLLERR){
//发生错误
if(errorCallback_){
errorCallback_();
}
}
if(revents_ & (EPOLLIN | EPOLLPRI)){
if(readCallback_){
readCallback_(receiveTime);
}
}
if(revents_ & EPOLLOUT){
if(writeCallback_){
writeCallback_();
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化