Files
mir_server/sdk/srvlib/include/SendPackPool.h

181 lines
8.3 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/************************************************************************
1
2
3使
allocSendPacketList或allocSendPacketList
flushSendPacket或flushSendPacketList函数将数据包提
sendToSocket函数将发送队列中的数据包通过socket对象发送
sendToSocket的调用中并不一定会将发送队列的数据包全部发送完成socket
1 线使
AllocSendPacketList一次性申请多个发送数据包
FlushSendPacketList一次性全部提交一个
/
/
使
0FlushSendPacketList函数不会修改提交数据包列表
2 /
/
************************************************************************/
using namespace wylib::container;
class CSendPacketPool
{
public:
CSendPacketPool();
~CSendPacketPool();
/* 申请一份发送数据包
* FlushSendPacket提交发送数据
*
*/
inline CDataPacket& allocSendPacket()
{
CDataPacket *pPacket;
allocSendPacketList(*((CBaseList<CDataPacket*>*)NULL), 0, &pPacket);
pPacket->setLength(0);
return *pPacket;
}
/* 提交一份数据包到发送队列中
*/
inline VOID flushSendPacket(CDataPacket& packet)
{
//检查数据包内存是否被破坏
packet._Assert();
//如果数据包中被写入了数据则提交到发送队列,否则还原数据包到空闲队列
if (packet.getLength() > 0)
{
//调整数据包偏移为0才能在发送数据的从数据包头部开始发送
packet.setPosition(0);
//将数据包追加到发送队列中
m_SendingPacketList.append(&packet);
}
else
{
m_FreeSendPackList.lock();
m_FreeSendPackList.add(&packet);
m_FreeSendPackList.unlock();
}
}
/* 申请一批发送数据包
* FlushSendPacket提交单个数据包或FlushSendPacketList提交多个数据包到发送队列
*
* packetList
* nAllocCount
* ppSingleAlloc nAllocCount+1nAllocCount
* nAllocCount中并单独向*ppSingleAlloc中保存一个
* remarksppSingleAlloc和packetList中存储的数据包
*
*/
VOID allocSendPacketList(CBaseList<CDataPacket*>& packetList, INT_PTR nAllocCount, CDataPacket **ppSingleAlloc = NULL);
/* 提交一批发送数据包
*
* packetList
* Postion处发送到Length处
*/
inline VOID flushSendPacketList(CBaseList<CDataPacket*>& packetList)
{
m_SendingPacketList.appendArray(packetList, packetList.count());
}
/* 情况发送队列中的数据包
*
*
* sendToSocket函数的线程调用线
* 线线
*/
VOID clearSendList();
/* 将发送数据队列中的数据包通过套接字发送
*
* socket
* @return
*/
size_t sendToSocket(wylib::inet::socket::CCustomSocket& socket);
/* 获取队列中等待发送的数据包数量
* @return
*/
inline size_t getPacketCount(){ return m_SendingPacketList.count() + m_SendingPacketList.appendCount(); }
/*
* Comments: cache的自由内存太多的时候
* Param bool bIgnoreInterval:
* Param int nMaxFreeMemorySize:
* @Return void:
* @Remark:
*/
inline void CheckMemory(bool bIgnoreInterval = false,int nMaxMemorySize = 30 * 1024 * 1024)
{
static const size_t sMinSize =1* 1024 * 1024; //最小的检测内存的下限,防止参数有问题,小于这个就不
CBufferAllocator::ALLOCATOR_MEMORY_INFO mi;
m_Allocator.GetMemoryInfo(&mi);
size_t sumSize = mi.SmallBuffer.dwFreeSize + mi.MiddleBuffer.dwFreeSize
+ mi.LargeBuffer.dwFreeSize + mi.SuperBuffer.dwFreeSize;
if(sumSize < sMinSize) return; //如果少于1m没有必要
if (sumSize > (size_t)nMaxMemorySize)
{
//OutputMsg(rmTip,"SendPackPool check memory,free size=%d",)
m_Allocator.CheckFreeBuffers(bIgnoreInterval);
}
}
//获取内存管理器,用于分析内存使用情况
CBufferAllocator &GetBuffAlloc()
{
return m_Allocator;
}
/*
* Comments:
* Param size_t * pSendingSize:,0
* Param size_t * pFreeSendSize:0
* Param size_t * pMaxSize:0
* @Return size_t:
*/
size_t GetMemoryUsage(size_t *pSendingSize=NULL,size_t* pFreeSendSize=NULL,size_t* pMaxSize=NULL );
private:
//销毁并释放所有的数据包
VOID FreeAllPackets();
private:
CBufferAllocator m_Allocator; //内存块管理器
protected:
CCSLock m_SendingPacketLock;//发送中的数据包队列锁
CCSLock m_FreeSendPackLock; //空闲的数据包队列锁
INT_PTR m_nSendingPacketIdx;//发送队列中的起始发送位置
CQueueList<CDataPacket*> m_SendingPacketList;//发送中的数据包队列
CLockList<CDataPacket*> m_FreeSendPackList; //空闲的数据包队列
INT_PTR m_dwPackAllocCount; //这批次申请的包的数目
//CBaseList<CDataPacket*> m_SendPacketMemList;//数据包内存块指针列表
//CBaseList<CDataPacket*> m_SinglePacketList; //在申请单个数据包的时候临时用的列表
};