?? tfixedalloc.cpp
字號:
// TFixedAlloc.cpp - implementation of fixed block allocator
#include "TFixedAlloc.h"
/////////////////////////////////////////////////////////////////////////////
// TFixedAlloc
TFixedAlloc::TFixedAlloc( TUINT nAllocSize, TUINT nBlockSize )
{
//MYASSERT( nAllocSize >= sizeof(TNode) );
//MYASSERT( nBlockSize > 1 );
m_nAllocSize = nAllocSize;
m_nBlockSize = nBlockSize;
m_pBlocks = TNULL;
m_pNodeFree = TNULL;
MyInitializeCriticalSection(&m_protect);
}
TFixedAlloc::~TFixedAlloc()
{
FreeAll();
MyDeleteCriticalSection(&m_protect);
}
void TFixedAlloc::FreeAll()
{
MyEnterCriticalSection(&m_protect);
m_pBlocks->FreeDataChain();
m_pBlocks = TNULL;
m_pNodeFree = TNULL;
MyLeaveCriticalSection(&m_protect);
}
void* TFixedAlloc::Alloc()
{
MyEnterCriticalSection(&m_protect);
if( m_pNodeFree == TNULL )
{
TPlex * pNewBlock = TNULL;
try
{
// add another block
pNewBlock = TPlex::Create(m_pBlocks, m_nBlockSize, m_nAllocSize);
}
catch( ... )
{
MyLeaveCriticalSection(&m_protect);
return TNULL;
}
// chain them into free list
TNode * pNode = (TNode *)pNewBlock->data();
// free in reverse order to make it easier to debug
(TBYTE*&)pNode += (m_nAllocSize * m_nBlockSize) - m_nAllocSize;
for( int i = m_nBlockSize-1; i >= 0; i--, (TBYTE*&)pNode -= m_nAllocSize )
{
pNode->pNext = m_pNodeFree;
m_pNodeFree = pNode;
}
}
//MYASSERT(m_pNodeFree != NULL); // we must have something
// remove the first available node from the free list
void* pNode = m_pNodeFree;
m_pNodeFree = m_pNodeFree->pNext;
MyLeaveCriticalSection(&m_protect);
return pNode;
}
void TFixedAlloc::Free( void* p )
{
if( p != TNULL )
{
MyEnterCriticalSection(&m_protect);
// simply return the node to the free list
TNode * pNode = (TNode*)p;
pNode->pNext = m_pNodeFree;
m_pNodeFree = pNode;
MyLeaveCriticalSection(&m_protect);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -