📄 fdset.cpp
字号:
#include "fdset.h"
#include <string.h>
#include <assert.h>
//#include <z_dbg.h>
HRET fdset::create(size_t bufSize)
{
if (bufSize == 0)
return -1;
clear();
try{
m_pfds = new fdbase*[bufSize];
m_pUnused = new int[bufSize];
}catch(...){
delete[] m_pfds;
delete[] m_pUnused;
m_pfds = 0;
m_pUnused = 0;
return -1;
}
memset(m_pfds, 0, sizeof(fdbase*)*bufSize);
for(size_t i = 0 ; i < bufSize ; ++i)
m_pUnused[i] = i;
m_bufSize = bufSize;
return 0;
}
HRET fdset::expand(size_t bufSize)
{
if (bufSize <= m_bufSize)
return 0;
fdbase** pfds = 0;
int* pUnused = 0;
try{
pfds = new fdbase*[bufSize];
pUnused = new int[bufSize];
}catch(...){
delete[] pfds;
delete[] pUnused;
return -1;
}
// 拷贝原有数据
if (m_cnt > 0){
memcpy(pfds, m_pfds, sizeof(fdbase*)*m_bufSize);
memcpy(pUnused, m_pUnused, sizeof(int)*m_bufSize);
}
// 清空新分配的m_pfds的后半截
memset(m_pfds+m_bufSize, 0, sizeof(fdbase*)*(bufSize-m_bufSize));
// 置新分配的索引值为未使用状态,加入到未使用列表(m_pUnused)。
for(size_t i = m_bufSize ; i < bufSize ; ++i)
pUnused[i] = i;
// 转移
delete[] m_pfds;
delete[] m_pUnused;
m_pfds = pfds;
m_pUnused = pUnused;
m_bufSize = bufSize;
return 0;
}
HRET fdset::add(fdbase& fb)
{
if (m_cnt >= m_bufSize)
return -1;
// 取下一个可分配的索引
int idx = m_pUnused[m_cnt];
assert(m_pfds[idx] == 0);
assert(idx >= 0 && idx < (int)m_bufSize);
m_pfds[idx] = &fb;
++m_cnt;
return idx;
}
HRET fdset::remove(int idx)
{
assert(idx >= 0 && idx < (int)m_bufSize);
assert(m_pfds[idx] != 0);
assert(m_cnt > 0);
if (m_pfds[idx] == 0)
return -1;
m_pfds[idx] = 0;
m_pUnused[--m_cnt] = idx;
return 0;
}
void fdset::clear()
{
delete[] m_pfds;
delete[] m_pUnused;
m_pfds = 0;
m_pUnused = 0;
m_cnt = 0;
m_bufSize = 0;
}
void fdset::destroy()
{
for(size_t i = 0 ; i < m_bufSize ; ++i)
delete m_pfds[i];
clear();
}
void fdset::reset()
{
memset(m_pfds, 0, sizeof(fdbase*)*m_bufSize);
for(size_t i = 0 ; i < m_bufSize ; ++i)
m_pUnused[i] = i;
m_cnt = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -