📄 mod_tcpbase.cpp
字号:
#include "stdafx.h"
#include "mod_tcpbase.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
TcpBuffQueue::~TcpBuffQueue()
{
FreeBuff();
TRACE(_T("TcpBuffQueue has been destroyed\n"));
}
bool TcpBuffQueue::AllocateBuff(UINT nBuffMax)
{
TcpBuffNode *pPool = new TcpBuffNode[nBuffMax];
if (pPool == NULL)
{
return false;
}
for (UINT i=0; i<nBuffMax; i++)
{
_queue_pool.AddTail(&pPool[i]);
}
_membase = pPool;
return true;
}
bool TcpBuffQueue::FreeBuff()
{
CSingleLock sLock(&_mutex);
TcpBuffNode *pNode = NULL;
sLock.Lock();
/* while (!_queue_pool.IsEmpty())
{
pNode = _queue_pool.RemoveHead();
delete pNode;
}
while (!_queue_used.IsEmpty())
{
pNode = _queue_used.RemoveHead();
delete pNode;
}
*/
_queue_pool.RemoveAll();
_queue_used.RemoveAll();
if (_membase)
delete[] _membase;
sLock.Unlock();
TRACE(_T("Free buffer pool\n"));
return true;
}
bool TcpBuffQueue::AddData(const char *buf, int len)
{
CSingleLock sLock(&_mutex);
TcpBuffNode *pnode = NULL;
sLock.Lock();
if (_queue_pool.IsEmpty())
{
sLock.Unlock();
TRACE(_T("Pool is empty, can not add any more\n"));
return false;
}
pnode = (_queue_pool.RemoveHead());
memcpy(pnode->_buff,buf,len);
pnode->_size = len;
_queue_used.AddTail(pnode);
sLock.Unlock();
return true;
}
bool TcpBuffQueue::GetData(char *buf, int *plen)
{
CSingleLock sLock(&_mutex);
TcpBuffNode *pnode = NULL;
sLock.Lock();
if (_queue_used.IsEmpty())
{
sLock.Unlock();
return false;
}
pnode = (_queue_used.RemoveHead());
memcpy(buf,pnode->_buff,pnode->_size);
*plen = pnode->_size;
memset(pnode->_buff,0,1024);
pnode->_size = 0;
_queue_pool.AddTail(pnode);
sLock.Unlock();
return true;
}
/*
* IsEmpty不可被TcpBuffQueue的成员函数所调用
* 它是给外部查询TcpBuffQueue是否为空的接口
*/
BOOL TcpBuffQueue::IsEmpty()
{
BOOL ret;
CSingleLock sLock(&_mutex);
sLock.Lock();
ret = _queue_used.IsEmpty();
sLock.Unlock();
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -