⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fdset.cpp

📁 socket的事件分发模型
💻 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 + -