⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tfixedalloc.cpp

📁 包中TMap
💻 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 + -