/*//=============================================================== << MEMORY POOL EX >> PRGM : B4nFter FILE : MEMPOOLEX.HPP DESC : ¸Þ¸ð¸® Ç® INIT BUILT DATE : 2004. 05. 17 LAST BUILT DATE : 2007. 09. 16 P.S.> - - Copyright¨Ï 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved. *///=============================================================== #pragma once /////////////////////////////////////////////////////////////////// // INCLUDE /////////////////////////////////////////////////////////////////// #include "SYSBASEBASE.H" #include #include /////////////////////////////////////////////////////////////////// // DEFINE /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // DECLARATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CMemPoolEx //*--------------------------------------------------------------- // DESC : ¸Þ¸ð¸® Ç® Ŭ·¡½º (Á¤Àû) // PRGM : B4nFter //*--------------------------------------------------------------- template class CMemPoolEx { public: CMemPoolEx(); virtual ~CMemPoolEx(); TDATA* GetMemory(); VOID ReleaseMemory(TDATA* lpData); protected: BOOL CreateMemory(INT iSize); private: std::vector m_vtMemManage; std::queue m_queMemPool; }; /////////////////////////////////////////////////////////////////// // IMPLEMENTATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CMemPoolEx::CMemPoolEx //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template CMemPoolEx::CMemPoolEx() { #pragma warning (disable:4127) if (0 < TINITSIZE) { CreateMemory(TINITSIZE); } #pragma warning (default:4127) } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CMemPoolEx::~CMemPoolEx //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template CMemPoolEx::~CMemPoolEx() { std::vector::iterator it = m_vtMemManage.begin(); for (;it != m_vtMemManage.end(); ++it) { delete [] *it; // temporary !!! ¡æ it have to be here // 20100322 º¯°æµÊ } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CMemPoolEx::CreateMemory //*--------------------------------------------------------------- // DESC : ¸Þ¸ð¸® Ç®¿¡ ƯÁ¤ °³¼öÀÇ ¸Þ¸ð¸® »ý¼º, Ãß°¡ // PARM : 1 . iSize - »ý¼ºÇÒ ¸Þ¸ð¸®ÀÇ Å©±â (°³¼ö) // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- template BOOL CMemPoolEx::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 : ¸Þ¸ð¸® Ç®¿¡¼­ ÇѰ³ÀÇ ¸Þ¸ð¸® ¿£Æ®¸®¸¦ °¡Á®¿È // PARM : N/A // RETV : ¸Þ¸ð¸® ¿£Æ®¸® Æ÷ÀÎÅÍ (¾òÀ» ¸Þ¸ð¸®°¡ ¾øÀ» ¶§´Â NULL) // PRGM : B4nFter //*--------------------------------------------------------------- #pragma warning (disable:4127) template TDATA* CMemPoolEx::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 : ¸Þ¸ð¸® Ç®¿¡ ÇѰ³ÀÇ ¸Þ¸ð¸®¸¦ ¹Ýȯ // PARM : 1 . lpData - ¹ÝȯÇÒ ¸Þ¸ð¸® // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template VOID CMemPoolEx::ReleaseMemory(TDATA* lpData) { m_queMemPool.push(lpData); }