This commit is contained in:
aixianling
2025-01-09 17:45:40 +08:00
commit 5c9f1dae4a
3482 changed files with 1146531 additions and 0 deletions

View File

@@ -0,0 +1,502 @@
#ifndef ___NOT_USE_MEMORY_POOL___
#include <stdlib.h>
#include <stdio.h>
#ifdef WIN32
#include <windows.h>
#include <tchar.h>
#endif
#include <_ast.h>
#include <_memchk.h>
#include <Tick.h>
#include "ShareUtil.h"
#include "BufferAllocatorEx.h"
static const DWORD dwBufferFreeTick = 30 * 1000;//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD>ͷŵĵ<C5B5><C4B5>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
/*
CBufferAllocator::CBufferAllocator()
{
m_pLastSmallBuffer = NULL;
m_pLastMiddleBuffer = NULL;
m_pLastLargeBuffer = NULL;
m_pLastSuperBuffer = NULL;
#ifdef _BUFFER_TRACE
m_pLastAllocedBuffer = NULL;
#endif
m_dwAllocedSmallSize = 0;
m_dwAllocedMiddleSize = 0;
m_dwAllocedLargeSize = 0;
m_dwAllocedSuperSize = 0;
m_dwFreedSmallSize = 0;
m_dwFreedMiddleSize = 0;
m_dwFreedLargeSize = 0;
m_dwFreedSuperSize = 0;
//InitializeCriticalSection( &m_BufferLock );
}
CBufferAllocator::~CBufferAllocator()
{
PBUFFER pBuffer, pPrevBuffer;
pBuffer = m_pLastSmallBuffer;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
free( pBuffer );
pBuffer = pPrevBuffer;
}
pBuffer = m_pLastMiddleBuffer;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
free( pBuffer );
pBuffer = pPrevBuffer;
}
pBuffer = m_pLastLargeBuffer;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
free( pBuffer );
pBuffer = pPrevBuffer;
}
pBuffer = m_pLastSuperBuffer;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
free( pBuffer );
pBuffer = pPrevBuffer;
}
#ifdef _BUFFER_TRACE
pBuffer = m_pLastAllocedBuffer;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
TRACE( _T("%s(%d) : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ͷţ<CDB7>pointer Addr=%d\n"), pBuffer->al.lpFile, pBuffer->al.nLine,(INT_PTR)pBuffer );
free( pBuffer );
pBuffer = pPrevBuffer;
//Assert(FALSE);//<2F><><EFBFBD>ڴ<EFBFBD>й©<D0B9><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
#endif
//DeleteCriticalSection( &m_BufferLock );
m_BufferLock.Unlock();
}
#ifndef _BUFFER_TRACE
PVOID CBufferAllocator::AllocBuffer(size_t dwSize)
#else
PVOID CBufferAllocator::_AllocBuffer(size_t dwSize, const char *lpFile, int nLine)
#endif
{
PBUFFER pBuffer, pPrev, pResult = NULL;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>100M<30><4D>ǿ<EFBFBD><C7BF><EFBFBD>ͷ<EFBFBD><CDB7>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
if(m_dwFreedSuperSize + m_dwFreedSmallSize + m_dwFreedMiddleSize +m_dwFreedLargeSize>= 104857600 )
{
CheckFreeBuffers(true);
}
//EnterCriticalSection( &m_BufferLock );
m_BufferLock.Lock();
if ( dwSize <= SmallBufferSize )
{
if ( m_pLastSmallBuffer )
{
pResult = m_pLastSmallBuffer;
m_pLastSmallBuffer = pResult->pPrevBuffer;
pResult->pPrevBuffer = NULL;
m_dwFreedSmallSize -= SmallBufferSize;
}
else
{
#ifdef _BUFFER_TRACE
pResult = (PBUFFER)malloc( SmallBufferSize + sizeof(*pResult) + sizeof(INT) );
#else
pResult = (PBUFFER)malloc( SmallBufferSize + sizeof(*pResult) );
#endif
pResult->dwSize = SmallBufferSize;
pResult->pPrevBuffer = NULL;
#ifdef _BUFFER_TRACE
pResult->boUsing = FALSE;
pResult->pNextBuffer = NULL;
#endif
}
m_dwAllocedSmallSize += SmallBufferSize;
}
else if ( dwSize <= MiddleBufferSize )
{
if ( m_pLastMiddleBuffer )
{
pResult = m_pLastMiddleBuffer;
m_pLastMiddleBuffer = pResult->pPrevBuffer;
pResult->pPrevBuffer = NULL;
m_dwFreedMiddleSize -= MiddleBufferSize;
}
else
{
#ifdef _BUFFER_TRACE
pResult = (PBUFFER)malloc( MiddleBufferSize + sizeof(*pResult) + sizeof(INT) );
#else
pResult = (PBUFFER)malloc( MiddleBufferSize + sizeof(*pResult) );
#endif
pResult->dwSize = MiddleBufferSize;
pResult->pPrevBuffer = NULL;
#ifdef _BUFFER_TRACE
pResult->boUsing = FALSE;
pResult->pNextBuffer = NULL;
#endif
}
m_dwAllocedMiddleSize += MiddleBufferSize;
}
else if ( dwSize <= LargeBufferSize )
{
if ( m_pLastLargeBuffer )
{
pResult = m_pLastLargeBuffer;
m_pLastLargeBuffer = pResult->pPrevBuffer;
pResult->pPrevBuffer = NULL;
m_dwFreedLargeSize -= LargeBufferSize;
}
else
{
#ifdef _BUFFER_TRACE
pResult = (PBUFFER)malloc( LargeBufferSize + sizeof(*pResult) + sizeof(INT) );
#else
pResult = (PBUFFER)malloc( LargeBufferSize + sizeof(*pResult) );
#endif
pResult->dwSize = LargeBufferSize;
pResult->pPrevBuffer = NULL;
#ifdef _BUFFER_TRACE
pResult->boUsing = FALSE;
pResult->pNextBuffer = NULL;
#endif
}
m_dwAllocedLargeSize += LargeBufferSize;
}
else
{
pPrev = NULL;
pBuffer = m_pLastSuperBuffer;
while ( pBuffer )
{
if ( pBuffer->dwSize >= dwSize )
{
pResult = pBuffer;
#ifdef _BUFFER_TRACE
Assert( !pResult->boUsing );
#endif
if ( pResult == m_pLastSuperBuffer )
{
m_pLastSuperBuffer = pResult->pPrevBuffer;
pResult->pPrevBuffer = NULL;
}
else if ( pPrev )
{
pPrev->pPrevBuffer = pResult->pPrevBuffer;
pResult->pPrevBuffer = NULL;
}
m_dwFreedSuperSize -= pResult->dwSize;
break;
}
pPrev = pBuffer;
pBuffer = pBuffer->pPrevBuffer;
}
if ( !pResult )
{
dwSize = (dwSize + 511) & (~511);
#ifdef _BUFFER_TRACE
pResult = (PBUFFER)malloc( dwSize + sizeof(*pResult) + sizeof(INT) );
#else
pResult = (PBUFFER)malloc( dwSize + sizeof(*pResult) );
#endif
pResult->dwSize = dwSize;
pResult->pPrevBuffer = NULL;
#ifdef _BUFFER_TRACE
pResult->boUsing = FALSE;
pResult->pNextBuffer = NULL;
#endif
}
m_dwAllocedSuperSize += pResult->dwSize;
}
#ifdef _BUFFER_TRACE
if ( pResult )
{
Assert( !pResult->boUsing );
pResult->boUsing = TRUE;
pResult->al.lpFile = lpFile;
pResult->al.nLine = nLine;
pResult->fl.lpFile = NULL;
pResult->fl.nLine = 0;
pResult->dwFreeTick = 0;
*((PINT)((char*)(pResult + 1) + pResult->dwSize)) = 0xCC55EE33;
if ( m_pLastAllocedBuffer ) m_pLastAllocedBuffer->pNextBuffer = pResult;
pResult->pPrevBuffer = m_pLastAllocedBuffer;
pResult->pNextBuffer = NULL;
m_pLastAllocedBuffer = pResult;
}
#endif
//LeaveCriticalSection( &m_BufferLock );
m_BufferLock.Unlock();
return pResult ? pResult + 1 : NULL;
}
#ifndef _BUFFER_TRACE
PVOID CBufferAllocator::ReallocBuffer(PVOID ptr, size_t dwNewSize)
#else
PVOID CBufferAllocator::_ReallocBuffer(PVOID ptr, size_t dwNewSize, const char* lpFile, int nLine)
#endif
{
if (dwNewSize == 0)
{
FreeBuffer(ptr);
return NULL;
}
PBUFFER pBuffer;
if (ptr)
{
pBuffer = ((PBUFFER)ptr) - 1;
if (dwNewSize <= pBuffer->dwSize)
return ptr;
}
PVOID pResult;
#ifndef _BUFFER_TRACE
pResult = AllocBuffer(dwNewSize);
if (ptr)
{
memcpy(pResult, ptr, pBuffer->dwSize);
FreeBuffer(ptr);
}
#else
pResult = _AllocBuffer(dwNewSize, lpFile, NULL);
if (ptr)
{
memcpy(pResult, ptr, pBuffer->dwSize);
_FreeBuffer(ptr, lpFile, NULL);
}
#endif
return pResult;
}
#ifndef _BUFFER_TRACE
VOID CBufferAllocator::FreeBuffer(PVOID ptr)
#else
VOID CBufferAllocator::_FreeBuffer(PVOID ptr, const char* lpFile, int nLine)
#endif
{
PBUFFER pBuffer;
if (!ptr) return;
pBuffer = ((PBUFFER)ptr) - 1;
//EnterCriticalSection( &m_BufferLock );
m_BufferLock.Lock();
#ifdef _BUFFER_TRACE
if ( !pBuffer->boUsing )
{
//TRACE( _T(__FUNCTION__)_T(" <20><>ͼ<EFBFBD>ͷ<EFBFBD><CDB7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ͷŵ<CDB7><C5B5>ڴ<EFBFBD><DAB4><EFBFBD>(%X,<2C><>С:%d)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD>%s(%d)<29><><EFBFBD>ͷ<EFBFBD>λ<EFBFBD>ã<EFBFBD>%s(%d)\n"),
// pBuffer, pBuffer->dwSize, pBuffer->al.lpFile, pBuffer->al.nLine,
// pBuffer->fl.lpFile, pBuffer->fl.nLine );
OutputMsg(rmError, _T(" %s<><73>ͼ<EFBFBD>ͷ<EFBFBD><CDB7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ͷŵ<CDB7><C5B5>ڴ<EFBFBD><DAB4><EFBFBD>(%X,<2C><>С:%d)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD>%s(%d)<29><><EFBFBD>ͷ<EFBFBD>λ<EFBFBD>ã<EFBFBD>%s(%d)\n"),
__FUNCTION__,pBuffer, pBuffer->dwSize, pBuffer->al.lpFile, pBuffer->al.nLine,
pBuffer->fl.lpFile, pBuffer->fl.nLine );
}
Assert( pBuffer->boUsing );
pBuffer->boUsing = FALSE;
Assert(*((PINT)((char*)(pBuffer + 1) + pBuffer->dwSize)) == 0xCC55EE33);
if ( pBuffer->pPrevBuffer )
pBuffer->pPrevBuffer->pNextBuffer = pBuffer->pNextBuffer;
if ( pBuffer->pNextBuffer )
pBuffer->pNextBuffer->pPrevBuffer = pBuffer->pPrevBuffer;
if ( pBuffer == m_pLastAllocedBuffer )
m_pLastAllocedBuffer = pBuffer->pPrevBuffer;
pBuffer->pPrevBuffer = NULL;
pBuffer->pNextBuffer = NULL;
pBuffer->fl.lpFile = lpFile;
pBuffer->fl.nLine = nLine;
#endif
pBuffer->dwFreeTick = _getTickCount() + dwBufferFreeTick;
if ( pBuffer->dwSize == SmallBufferSize )
{
pBuffer->pPrevBuffer = m_pLastSmallBuffer;
m_pLastSmallBuffer = pBuffer;
m_dwAllocedSmallSize -= SmallBufferSize;
m_dwFreedSmallSize += SmallBufferSize;
}
else if ( pBuffer->dwSize == MiddleBufferSize )
{
pBuffer->pPrevBuffer = m_pLastMiddleBuffer;
m_pLastMiddleBuffer = pBuffer;
m_dwAllocedMiddleSize -= MiddleBufferSize;
m_dwFreedMiddleSize += MiddleBufferSize;
}
else if ( pBuffer->dwSize == LargeBufferSize )
{
pBuffer->pPrevBuffer = m_pLastLargeBuffer;
m_pLastLargeBuffer = pBuffer;
m_dwAllocedLargeSize -= LargeBufferSize;
m_dwFreedLargeSize += LargeBufferSize;
}
else
{
pBuffer->pPrevBuffer = m_pLastSuperBuffer;
m_pLastSuperBuffer = pBuffer;
m_dwAllocedSuperSize -= pBuffer->dwSize;
m_dwFreedSuperSize += pBuffer->dwSize;
}
//LeaveCriticalSection( &m_BufferLock );
m_BufferLock.Lock();
}
VOID CBufferAllocator::GetMemoryInfo(CBufferAllocator::PALLOCATPR_MEMORY_INFOR pMemoryInfo)
{
pMemoryInfo->SmallBuffer.dwAllocSize = m_dwAllocedSmallSize;
pMemoryInfo->SmallBuffer.dwFreeSize = m_dwFreedSmallSize;
pMemoryInfo->MiddleBuffer.dwAllocSize = m_dwAllocedMiddleSize;
pMemoryInfo->MiddleBuffer.dwFreeSize = m_dwFreedMiddleSize;
pMemoryInfo->LargeBuffer.dwAllocSize = m_dwAllocedLargeSize;
pMemoryInfo->LargeBuffer.dwFreeSize = m_dwFreedLargeSize;
pMemoryInfo->SuperBuffer.dwAllocSize = m_dwAllocedSuperSize;
pMemoryInfo->SuperBuffer.dwFreeSize = m_dwFreedSuperSize;
}
VOID CBufferAllocator::CheckFreeBuffers(bool bIgnoreInterval)
{
PBUFFER pBuffer, pPrevBuffer, pLastBuffer;
LONGLONG dwTick = _getTickCount();
//EnterCriticalSection( &m_BufferLock );
m_BufferLock.Lock();
pBuffer = m_pLastSmallBuffer;
pLastBuffer = NULL;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
if (bIgnoreInterval || dwTick >= pBuffer->dwFreeTick)
{
if ( pBuffer == m_pLastSmallBuffer )
m_pLastSmallBuffer = pPrevBuffer;
if ( pLastBuffer )
pLastBuffer->pPrevBuffer = pPrevBuffer;
m_dwFreedSmallSize -= pBuffer->dwSize;
free( pBuffer );
}
else pLastBuffer = pBuffer;
pBuffer = pPrevBuffer;
}
pBuffer = m_pLastMiddleBuffer;
pLastBuffer = NULL;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
if (bIgnoreInterval || dwTick >= pBuffer->dwFreeTick)
{
if ( pBuffer == m_pLastMiddleBuffer )
m_pLastMiddleBuffer = pPrevBuffer;
if ( pLastBuffer )
pLastBuffer->pPrevBuffer = pPrevBuffer;
m_dwFreedMiddleSize -= pBuffer->dwSize;
free( pBuffer );
}
else pLastBuffer = pBuffer;
pBuffer = pPrevBuffer;
}
pBuffer = m_pLastLargeBuffer;
pLastBuffer = NULL;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
if (bIgnoreInterval || dwTick >= pBuffer->dwFreeTick)
{
if ( pBuffer == m_pLastLargeBuffer )
m_pLastLargeBuffer = pPrevBuffer;
if ( pLastBuffer )
pLastBuffer->pPrevBuffer = pPrevBuffer;
m_dwFreedLargeSize -= pBuffer->dwSize;
free( pBuffer );
}
else pLastBuffer = pBuffer;
pBuffer = pPrevBuffer;
}
pBuffer = m_pLastSuperBuffer;
pLastBuffer = NULL;
while ( pBuffer )
{
pPrevBuffer = pBuffer->pPrevBuffer;
if (bIgnoreInterval || dwTick >= pBuffer->dwFreeTick)
{
if ( pBuffer == m_pLastSuperBuffer )
m_pLastSuperBuffer = pPrevBuffer;
if ( pLastBuffer )
pLastBuffer->pPrevBuffer = pPrevBuffer;
m_dwFreedSuperSize -= pBuffer->dwSize;
free( pBuffer );
}
else pLastBuffer = pBuffer;
pBuffer = pPrevBuffer;
}
//LeaveCriticalSection( &m_BufferLock );
m_BufferLock.Unlock();
}
#ifdef _BUFFER_TRACE
DataBuffer::DataBuffer(CBufferAllocator *pAllocator, size_t dwSize, const char *_FILE, const int _LINE)
#else
DataBuffer::DataBuffer(CBufferAllocator *pAllocator, size_t dwSize)
#endif
{
m_pAllocator = pAllocator;
m_dwSize = dwSize;
#ifdef _BUFFER_TRACE
pData = (char*)pAllocator->_AllocBuffer(dwSize, _FILE, _LINE);
#else
pData = (char*)pAllocator->AllocBuffer(dwSize);
#endif
ptr = pReadPtr = pData;
pEnd = pData + dwSize;
}
DataBuffer::~DataBuffer()
{
m_pAllocator->FreeBuffer( pData );
}
*/
#endif