DragonNest/Server/ServiceMonitorEx/Source/MemPoolEx.hpp

187 lines
4.9 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< MEMORY POOL EX >>
PRGM : B4nFter
FILE : MEMPOOLEX.HPP
DESC : <EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD> Ǯ
INIT BUILT DATE : 2004. 05. 17
LAST BUILT DATE : 2007. 09. 16
P.S.>
-
-
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
*///===============================================================
#pragma once
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "SYSBASEBASE.H"
#include <VECTOR>
#include <QUEUE>
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CMemPoolEx
//*---------------------------------------------------------------
// DESC : <20>޸<EFBFBD><DEB8><EFBFBD> Ǯ Ŭ<><C5AC><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>)
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TDATA, INT TINITSIZE = 64, INT TINCRSIZE = 0>
class CMemPoolEx
{
public:
CMemPoolEx();
virtual ~CMemPoolEx();
TDATA* GetMemory();
VOID ReleaseMemory(TDATA* lpData);
protected:
BOOL CreateMemory(INT iSize);
private:
std::vector<TDATA*> m_vtMemManage;
std::queue<TDATA*> m_queMemPool;
};
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemPoolEx::CMemPoolEx
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TDATA, INT TINITSIZE, INT TINCRSIZE>
CMemPoolEx<TDATA, TINITSIZE, TINCRSIZE>::CMemPoolEx()
{
#pragma warning (disable:4127)
if (0 < TINITSIZE) {
CreateMemory(TINITSIZE);
}
#pragma warning (default:4127)
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemPoolEx::~CMemPoolEx
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TDATA, INT TINITSIZE, INT TINCRSIZE>
CMemPoolEx<TDATA, TINITSIZE, TINCRSIZE>::~CMemPoolEx()
{
std::vector<TDATA*>::iterator it = m_vtMemManage.begin();
for (;it != m_vtMemManage.end(); ++it) {
delete [] *it; // temporary !!! <20><> it have to be here // 20100322 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemPoolEx::CreateMemory
//*---------------------------------------------------------------
// DESC : <20>޸<EFBFBD><DEB8><EFBFBD> Ǯ<><C7AE> Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>߰<EFBFBD>
// PARM : 1 . iSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9> (<28><><EFBFBD><EFBFBD>)
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TDATA, INT TINITSIZE, INT TINCRSIZE>
BOOL CMemPoolEx<TDATA, TINITSIZE, TINCRSIZE>::CreateMemory(INT iSize)
{
if (iSize <= 0)
return FALSE;
TDATA* lpData = new TDATA[iSize]; // 20100322 LNK2005
if (lpData != NULL)
{
m_vtMemManage.push_back(lpData);
for (INT i = 0 ; i < iSize ; ++i)
{
m_queMemPool.push(((TDATA*)lpData)+i);
}
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemPoolEx::GetMemory
//*---------------------------------------------------------------
// DESC : <20>޸<EFBFBD><DEB8><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : <20>޸<EFBFBD><DEB8><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20>޸𸮰<DEB8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> NULL)
// PRGM : B4nFter
//*---------------------------------------------------------------
#pragma warning (disable:4127)
template<class TDATA, INT TINITSIZE, INT TINCRSIZE>
TDATA* CMemPoolEx<TDATA, TINITSIZE, TINCRSIZE>::GetMemory()
{
if (m_queMemPool.empty()) {
if (TINCRSIZE > 0) {
BOOL bRetVal = CreateMemory(TINCRSIZE);
if (bRetVal == FALSE) {
return NULL;
}
}
else {
return NULL;
}
}
TDATA* lpRetMem = m_queMemPool.front();
m_queMemPool.pop();
return lpRetMem;
}
#pragma warning (default : 4127)
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CMemPoolEx::ReleaseMemory
//*---------------------------------------------------------------
// DESC : <20>޸<EFBFBD><DEB8><EFBFBD> Ǯ<><C7AE> <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20>޸𸮸<DEB8> <20><>ȯ
// PARM : 1 . lpData - <20><>ȯ<EFBFBD><C8AF> <20>޸<EFBFBD><DEB8><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TDATA, INT TINITSIZE, INT TINCRSIZE>
VOID CMemPoolEx<TDATA, TINITSIZE, TINCRSIZE>::ReleaseMemory(TDATA* lpData)
{
m_queMemPool.push(lpData);
}