#include "stdafx.h" #include "CGlassPool.h" #define DEFAULT_GLASS_POOL_SIZE 1024 namespace SERVO { CGlassPool::CGlassPool() { InitializeCriticalSection(&m_criticalSection); } CGlassPool::~CGlassPool() { DeleteCriticalSection(&m_criticalSection); } void CGlassPool::initPool() { auto onReleaseAny = [&](void* pAny) -> void { // »ØÊÕGlass freeGlass((CGlass*)pAny); }; // ·ÖÅäCGlass³Ø Lock(); for (int i = 0; i < DEFAULT_GLASS_POOL_SIZE; i++) { CGlass* pGlass = new CGlass(); pGlass->setOnRelease(onReleaseAny); m_lsitAvailable.push_back(pGlass); } Unlock(); } void CGlassPool::term() { Lock(); for (auto item : m_lsitAvailable) { delete item; } m_lsitAvailable.clear(); for (auto item : m_mapOccupation) { delete item.second; } m_mapOccupation.clear(); Unlock(); } CGlass* CGlassPool::allocaGlass() { Lock(); CGlass* pGlass = NULL; if (!m_lsitAvailable.empty()) { pGlass = m_lsitAvailable.front(); m_lsitAvailable.pop_front(); m_mapOccupation[pGlass] = pGlass; } Unlock(); return pGlass; } void CGlassPool::freeGlass(CGlass* pGlass) { // »ØÊÕCAny Lock(); pGlass->reset(); auto iter = m_mapOccupation.find(pGlass); if (iter != m_mapOccupation.end()) { m_lsitAvailable.push_back(iter->second); m_mapOccupation.erase(iter); } Unlock(); } int CGlassPool::getAvailableSize() { Lock(); int nSize = (int)(m_lsitAvailable.size()); Unlock(); return nSize; } }