📄 selector.h
字号:
#ifndef SELECTOR_H_
#define SELECTOR_H_
#include "fdset.h"
#include "skset.h"
#include <assert.h>
class ZBCDLL selector
{
public:
HRET create(size_t bufSize); // 创建bufSize大小的select池
HRET expand(size_t bufSize); // 调整select池的大小
HRET add(fdbase& fd, int events = FDEVENT_IN | FDEVENT_OUT);// 将一个fdbase加入select池,设定初始侦听事件为events
HRET remove(int idx); // 移除一个fdbase
void clear(); // 清除所有的fdbase
void destroy();
size_t count() const; // select池内的fdbase个数
size_t capacity() const; // select池的容量
fdbase* get(int idx) const; //
void set_events(int idx, int events); // FDEVENT_IN | FDEVENT_OUT | FDEVENT_ERR | ...
void refresh(); // 刷新,取得各fdbase最新的读写许可
HRET wait(const struct timeval* ptv); // 侦测系统事件,并派送
#if zDEBUG
void print_freeze() const;
#endif
explicit selector(size_t bufSize = 1024);
~selector(){
clear();
}
private:
void dispatch_select(size_t cnt, fd_set* pr, fd_set* pw, fd_set* pe);
void fill_set();
void clr_set();
void clr_fds();
private:
fdset m_set; // fdbase集合
int* m_pfds; // 文件描述符数组,和m_set中的内容是一一对应的
int* m_pevents; // 事件数组
sockset m_rset; // 读集合
sockset m_wset; // 写集合
sockset m_eset; // 紧急数据集合
};
inline size_t selector::count() const
{
return m_set.count();
}
inline size_t selector::capacity() const
{
return m_set.capacity();
}
inline void selector::set_events(int idx, int events)
{
assert(idx >= 0 && idx < (int)m_set.capacity());
assert(m_pfds && m_pfds[idx] >= 0);
m_pevents[idx] = events;
}
inline fdbase* selector::get(int idx) const
{
return m_set.get(idx);
}
inline void selector::clr_set()
{
m_rset.clear();
m_wset.clear();
m_eset.clear();
}
inline void selector::clr_fds()
{
for(int i = m_set.capacity()-1 ; i >= 0 ; --i)
m_pfds[i] = -1;
}
inline void selector::fill_set()
{
m_rset.reset();
m_wset.reset();
m_eset.reset();
size_t cnt = m_set.count();
for(size_t i = 0 ; i < cnt ; ++i)
{
int fd = m_pfds[i];
int events = m_pevents[i];
if (fd >= 0){
if (events & FDEVENT_IN){
m_rset.add(fd);
}
if (events & FDEVENT_OUT){
m_wset.add(fd);
}
if (events & FDEVENT_ERR){
m_eset.add(fd);
}
}
}
}
#endif //SELECTOR_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -