#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;
|
}
|
}
|