CIOCPServer的数据结构定义及内存池方案
时间:2022-04-22
本文章向大家介绍CIOCPServer的数据结构定义及内存池方案,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
为了避免频繁的申请释放内存,使用内存池来管理缓冲区对象和客户上下文对象使用的内存。
使用指针保存所有空闲的内存块,形成空闲列表。
申请内存时,这个指针不为NULL,就从空闲列表中取出一个来使用,如果取完,就真正的申请内存。
1 缓冲区对象
程序使用CIOCPBuffer来描述per-IO数据,包含IO操作的必要信息,提交时,提交的就是CIOCPBuffer对象
下面是申请缓冲区对象代码:
CIOCPBuffer *CIOCPServer::AllocateBuffer(int nLen){
CIOCPBuffer *pBuffer = NULL;
if(nLen>BUFFER_SIZE)
return NULL;
::EnterCriticalSection(&m_FreeBufferListLock);
if(m_pFreeBufferList == NULL)
{
pBuffer=(CIOCPBuffer*)::HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CIOCPBuffer)+BUFFER_SIZE);
}
else
{
pBuffer = m_pFreeBufferList;
m_pFreeBufferList = m_pFreeBufferList->pNext;
pBuffer->pNext = NULL;
m_nFreeBufferCount--;
}
::LeaveCriticalSection(&m_FreeBufferListLock);
if(pBuffer!=NULL)
{
pBuffer->buff = (char*)(pBuffer+1);
pBuffer->nLen = nLen;
}
return pBuffer;
}
下面是释放缓冲区对象的代码:
void CIOCPServer::ReleaseBuffer(CIOCPBuffer *pBuffer)
{
::EnterCriticalSection(&m_pFreeBufferListLock);
if(m_nFreeBufferCount<=m_nMaxFreeBuffers)
{
memset(pBuffer,0,sizeof(CIOCPBuffer)+BUFFERSIZE);
pBuffer->pNext = m_pFreeBufferList;
m_pFreeBufferList = pBuffer;
m_pFreeBufferCount++;
}
else
{
::HeapFree(::GetProcessHeap(),0,pBuffer);
}
::LeaveCriticalSection(&m_pFreeBufferListLock);
}
2 客户区上下文对象
客户上下文对象便是per-Handle数据,包含了套接字的信息,服务器程序接收到一个新的连接,就为新连接创建客户上下文对象,以记录客户信息。
代码差不多与缓冲区上下文对象差不多,释放的代码如下:
void CIOCPServer::RealeaseContext(CIOCPContext *pContext)
{
if(pContext->s != INVALID_SOCKET)
::closesocket(pContext->s);
CIOCPBuffer *pNext;
while(pContext->pOutOfOrderReads !=NULL)
{
pNext = pContext->pOutOfOrderReads->pNext;
ReleaseBuffer(pContext->pOutOfOrderReads);
pContext->pOutOfOrderReads = pNext;
}
::EnterCriticalSection(&m_pFreeBufferListLock);
if(m_nFreeBufferCount<=m_nMaxFreeBuffers)
{
CRITICAL_SECTION cstmp = pContext->Lock;
memset(pContext,0,sizeof(CIOCPContext));
pContext->Lock = cstmp;
pContext->pNext = m_pFreeContextList;
m_pFreeContextList = pContext;
m_nFreeContextCount++;
}
else
{
::DeleteCriticalSection(&pContext->Lock);
::HeapFree(::GetProcessHeap(),0,pBuffer);
}
::LeaveCriticalSection(&m_pFreeBufferListLock);
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 递归解决遍历问题
- PHP中的include和require
- 一起来学matlab-matlab学习笔记10 10_2一般操作符和数据显示格式
- 一起来学matlab-matlab学习笔记10 10_3关系运算符和逻辑运算符
- 一篇文章学懂Shell脚本,最简明的教程在这里
- 一起来学matlab-matlab学习笔记10 10_5 通用字符串操作和比较函数
- 一个案例彻底弄懂如何正确使用 mysql inndb 联合索引
- 一起来学matlab-matlab学习笔记11 11_2 高维数组处理和运算 squeeze, ind2sub, sub2ind
- matlab结构体 rmfield,arrayfun,structfun,struct2cell,cell2struct
- PHP函数参数传递方法的具体改进技巧
- matlab学习笔记11_3 高维数组处理 filp, shiftdim, size, permute, ipermute
- 看完这篇文章,你的Linux基础就差不多了
- jzy3D从入门到弃坑
- git丢弃本地修改的所有文件(新增、删除、修改)
- Jmetal设置Solution Variables