handy源码阅读(五):PollerBase类
使用poll内核函数等待事件发生:
struct PollerBase: private noncopyable {
int64_t id_;
int lastActive_;
PollerBase(): lastActive_(-) {
static std::atomic<int64_t> id();
id_ = ++id;
} virtual void addChannel(Channel* ch) = ;
virtual void removeChannel(Channel* ch) = ;
virtual void updateChannel(Channel* ch) = ;
virtual ~PollerBase() {};
}; struct PollerEpoll : public PollerBase {
int fd_;
std::set<Channel*> liveChannels_;
struct epoll_event activeEvs_[kMaxEvents]; PollerEpoll();
~PollerEpoll();
void addChannel(Channel* ch) override;
void removeChannel(Channel* ch) override;
void updateChannel(Channel* ch) override;
void loop_once(int waitMs) override;
};
pollerEpoll的实现主要是使用了epoll类函数。
PollerBase* createPoller() {
return new PollerEpoll();
} PollerEpoll::PollerEpoll() {
fd_ = epoll_create1(EPOLL_CLOEXEC); //创建一个epoll文件描述符
} PollerEpoll::~PollerEpoll() {
while (liveChannels_.size()) {
(*liveChannels_.begin())->close(); //从poller中移除该通道,关闭通道上的文件描述符并处理该通道上的读事件。
}
::close(fd_); //关闭epoll文件描述符
} void PollerEpoll::addChannel(Channel* ch) {
struct epoll_event ev;
memset(&ev, 0, sizeof(ev));
ev.events = ch->events();
ev.data.ptr = ch;
int r = epoll_ctl(fd_, EPOLL_CTL_ADD, ch->fd(), &ev); //将通道内的文件描述符和其关心的事件添加到epoll监听中。
liveChannels_.insert(ch);
} void PollerEpoll::updateChannel(Channel* ch) {
struct epoll_event ev;
memset(&ev, 0, sizeof(ev));
ev.events = ch->events();
ev.data.ptr = ch;
int r = epoll_ctl(fd_, EPOLL_CTL_MOD, ch->fd(), &ev);
} void PollerEpoll::removeChannel(Channel* ch) {
liveChannels_.erase(ch);
for (int i = lastActive_; i >= 0; i--) {
if (ch == activeEvs_[i].data.ptr) {
activeEvs_[i].data.ptr = NULL;
break;
}
}
} //核心函数
void PollerEpoll::loop_once(int waitMs) {
lastActive_ = epoll_wait(fd_, activeEvs_, kMaxEvents, waitMs);
while (--lastActive_ >= 0) {
int i = lastActive_;
Channel* ch = (Channel*)activeEvs_[i].data.ptr;
int events = activeEvs_[i].events;
if (ch) {
if (events & kWriteEvent) {
ch->handleWrite();
}
if (events & (kReadEvent | POLLERR)) {
ch->handleRead();
}
if (!(events & (kReadEvent | kWriteEvent | POLLERR))) {
fatal("unexpected poller events");
}
}
}
}
handy源码阅读(五):PollerBase类的更多相关文章
- handy源码阅读(四):Channel类
通道,封装了可以进行epoll的一个fd. struct Channel: private noncopyable { Channel(EventBase* base, int fd, int eve ...
- handy源码阅读(二):EventsImp类
EventsImp用于完成事件的处理. class EventsImp { EventBase* base_; PollerBase* poller_; std::atomic<bool> ...
- handy源码阅读(六):tcp类
首先是tcpconn和tcpserver类: struct TcpConn : public std::enable_shared_from_this<TcpConn>, private ...
- handy源码阅读(六):udp类
分为UdpServer类和UdpConn类. struct UdpServer : public std::enable_shared_from_this<UdpServer>, priv ...
- handy源码阅读(三):SafeQueue类
SafeQueue类继承与信号量mutex(用于加锁),nonocopyable 定义如下: template <typename T> struct SafeQueue : privat ...
- handy源码阅读(一):EventBase类
类EventBase继承于类EventBases,继承于noncopyable. 其中noncopyable是一个去除了拷贝构造和赋值构造的类. noncopyable: class noncopy ...
- JDK源码阅读:Object类阅读笔记
Object 1. @HotSpotIntrinsicCandidate @HotSpotIntrinsicCandidate public final native Class<?> g ...
- Spark数据传输及ShuffleClient(源码阅读五)
我们都知道Spark的每个task运行在不同的服务器节点上,map输出的结果直接存储到map任务所在服务器的存储体系中,reduce任务有可能不在同一台机器上运行,所以需要远程将多个map任务的中间结 ...
- JDK源码阅读(五)java.io.Serializable接口
package java.io; public interface Serializable { } (1)实现Serializable接口的类,将会被提示提供一个 serialVersionUID ...
随机推荐
- 2018.03.29 python-pandas 数据透视pivot table / 交叉表crosstab
#透视表 pivot table #pd.pivot_table(data,values=None,index=None,columns=None, import numpy as np import ...
- yum安装Apache2.4
一.系统环境 系统版本为centos6.5最小化安装 # cat /etc/centos-release CentOS release 6.5 (Final) 查看系统自带yum库Apache版本 # ...
- 别把&和nohup混为一谈, 根本不是同一个东西好不好 ------ 聊聊./a.out & , nohut ./a.out , nohup ./a.out &的区别
在第一家公司工作的时候, 我认识了&,在第二家公司工作的时候, 我认识了nohup, 这就是渊源. 随后, 我就一直糊涂用他们, 但并不懂这两个东西. 网上很多地方是乱扯, 瞎复制, 为什 ...
- css简介和属性
CSS指的是层叠样式表(Cascading Style Sheets) 样式定义如何显示HTML元素,通常存储在样式表中. css使用方式 内联式 <!DOCTYPE html> < ...
- 关于linux中的目录配置标准以及文件基本信息
关于Linux中的目录配置标准 在查看docker.k8的运行日志,修改相关的运行记录的时候,学长总是能很快地找到目录,这个多多少少和Linux的FHS(File Hierarchy Standard ...
- 如何有效的使用google进行搜索的20个技能
每天有数百万人因为各种各样的原因使用谷歌搜索.学生们把它用于学校,商人们把它用于研究,还有数百万人把它用于娱乐.但大多数人可能没有充分利用谷歌搜索的潜力. 想要更有效地使用谷歌搜索,并得到您想要的搜索 ...
- CentOS7配置NFS网络文件系统
NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件.通过使用N ...
- RHEL 无图形界面安装oracle 11gr2
RHEL7.3 无图形界面安装oracle 11gr2 使用纯命令安装方式.提供RHEL全量系统镜像. 1.oracle官方下载地址:https://www.oracle.com/techne ...
- Spring Boot 深度调优,6得飞起~
项目调优 作为一名工程师,项目调优这事,是必须得熟练掌握的事情. 在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行. 一.修改配置文件 关于修改配置文件applicati ...
- 《剑指offer》面试题27 二叉搜索树与双向链表 Java版
(将BST改成排序的双向链表.) 我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列.如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单.关 ...