// step3/memory_pool.cpp
#if defined(MEM_POOL_USE_MALLOC)
#include <stdlib.h>
#else
#include <new>
#endif
#include "memory_pool.h"
/* Defines macros to abstract system memory routines */
# ifdef MEM_POOL_USE_MALLOC
# define MEM_POOL_ALLOCATE(Sz) malloc(Sz)
# define MEM_POOL_DEALLOCATE(Ptr) free(Ptr)
# else
# define MEM_POOL_ALLOCATE(Sz) ::operator new((Sz), std::nothrow)
# define MEM_POOL_DEALLOCATE(Ptr) ::operator delete(Ptr)
# endif
void* MemoryPoolBase::allocSys(size_t uSize)
{
void* pvResult = MEM_POOL_ALLOCATE(uSize);
if (!pvResult)
{
MemoryPoolSet::recycleMemoryPools();
pvResult = MEM_POOL_ALLOCATE(uSize);
}
return pvResult;
}
void MemoryPoolBase::deallocSys(void* pvReturn)
{
MEM_POOL_DEALLOCATE(pvReturn);
}
MemoryPoolSet::MemoryPoolSet()
{
}
MemoryPoolSet::~MemoryPoolSet()
{
while (!m_oMemoryPoolSet.empty())
{
// The destructor of a MemoryPool will remove itself from
// the MemoryPoolSet.
delete *m_oMemoryPoolSet.begin();
}
}
MemoryPoolSet& MemoryPoolSet::instance()
{
static MemoryPoolSet oInstance;
return oInstance;
}
void MemoryPoolSet::recycleMemoryPools()
{
instance().recycle();
}
void MemoryPoolSet::recycle()
{
std::set<MemoryPoolBase*>::iterator end = m_oMemoryPoolSet.end();
for (std::set<MemoryPoolBase*>::iterator
i = m_oMemoryPoolSet.begin();
i != end; ++i)
{
(*i)->recycle();
}
}