代码拉取完成,页面将自动刷新
/***
* @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_();
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。