93 lines
1.7 KiB
C++
93 lines
1.7 KiB
C++
#include "stdafx.h"
|
|
#include "MTSafeAllocator.h"
|
|
|
|
#if defined(LINUX)
|
|
#define USE_CRT 1
|
|
#else
|
|
//#ifdef _DEBUG
|
|
//#define USE_CRT 1
|
|
//#else
|
|
#define USE_CRT 0
|
|
//#endif
|
|
#endif //LINUX
|
|
|
|
CMTSafeHeap::CMTSafeHeap(unsigned nInitialSize, unsigned nMaxSize)
|
|
{
|
|
m_numAllocations = 0;
|
|
m_nTotalAllocations = 0;
|
|
#if !USE_CRT
|
|
m_hHeap = HeapCreate (0, nInitialSize, nMaxSize);
|
|
#endif
|
|
}
|
|
|
|
CMTSafeHeap::~CMTSafeHeap()
|
|
{
|
|
#if !defined(LINUX)
|
|
assert (m_numAllocations == 0);
|
|
#endif
|
|
#if !USE_CRT
|
|
assert (HeapValidate(m_hHeap, 0, NULL));
|
|
HeapDestroy (m_hHeap);
|
|
#endif
|
|
}
|
|
|
|
// consolidates free space inthe heap, uncommits if too much
|
|
void CMTSafeHeap::Compact()
|
|
{
|
|
#if !defined(LINUX)//empty
|
|
#if !USE_CRT
|
|
HeapCompact(m_hHeap, 0);
|
|
#else
|
|
_heapmin();
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void* CMTSafeHeap::TryAlloc(size_t nSize, const char* szDbgSource = NULL)
|
|
{
|
|
#if !USE_CRT
|
|
return HeapAlloc (m_hHeap, 0, nSize);
|
|
#else
|
|
#if !defined(LINUX) && defined(_DEBUG) && defined(_INC_CRTDBG) && defined(WIN32)
|
|
return _malloc_dbg (nSize, _NORMAL_BLOCK, szDbgSource, 0);
|
|
#else
|
|
return ::malloc (nSize);
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void* CMTSafeHeap::Alloc (size_t nSize, const char* szDbgSource = NULL)
|
|
{
|
|
InterlockedIncrement(&m_numAllocations);
|
|
void *pResult = TryAlloc(nSize, szDbgSource);
|
|
if (!pResult)
|
|
{
|
|
Compact();
|
|
pResult = TryAlloc(nSize, szDbgSource);
|
|
}
|
|
|
|
if (!pResult)
|
|
InterlockedDecrement(&m_numAllocations);
|
|
return pResult;
|
|
}
|
|
|
|
void CMTSafeHeap::Free (void*p)
|
|
{
|
|
if (p)
|
|
{
|
|
BOOL bFreed;
|
|
#if !USE_CRT
|
|
bFreed = HeapFree (m_hHeap, 0, p);
|
|
#else
|
|
#if !defined(LINUX) && defined(_DEBUG) && defined(_INC_CRTDBG) && defined(WIN32)
|
|
_free_dbg (p, _NORMAL_BLOCK);
|
|
#else
|
|
::free (p);
|
|
#endif
|
|
bFreed = true;
|
|
#endif
|
|
InterlockedDecrement(&m_numAllocations);
|
|
assert (bFreed);
|
|
}
|
|
}
|