Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
utilmem.cxx
Abstract:
Miscellaneous useful utilities
Author:
Sergey Solyanik (SergeyS)
--*/
#include "pch.h"
#pragma hdrstop
#include <svsutil.hxx>
//
// Allocation sector
//
FuncAlloc g_funcAlloc = svsutil_Alloc; FuncFree g_funcFree = svsutil_Free;
void *g_pvAllocData = NULL; void *g_pvFreeData = NULL;
#if (defined (_WINDOWS_) || defined (_WINDOWS_CE_)) && defined (SVSUTIL_DEBUG_HEAP)
class MemAllocChunk { public: unsigned int uiSignature1; unsigned int uiSignature2; unsigned int uiSize; unsigned int uiCalledFrom; MemAllocChunk *pPrev; MemAllocChunk *pNext; unsigned char data[8]; };
static CRITICAL_SECTION csGlobalAlloc; static unsigned int uiMemAllocated = 0; static MemAllocChunk *pAllocBlocks = NULL;
#endif
void svsutil_Initialize (void) { #if (defined (_WINDOWS_) || defined (_WINDOWS_CE_)) && defined (SVSUTIL_DEBUG_HEAP)
InitializeCriticalSection (&csGlobalAlloc); #endif
}
unsigned int svsutil_TotalAlloc (void) { #if (defined (_WINDOWS_) || defined (_WINDOWS_CE_)) && defined (SVSUTIL_DEBUG_HEAP)
return uiMemAllocated; #else
return 0; #endif
}
void *svsutil_Alloc (int iSize, void *pvData) { SVSUTIL_ASSERT (iSize > 0); SVSUTIL_ASSERT (pvData == g_pvAllocData);
#if (defined (_WINDOWS_) || defined (_WINDOWS_CE_)) && defined (SVSUTIL_DEBUG_HEAP)
int iTotalSize = iSize + offsetof (MemAllocChunk, data); MemAllocChunk *pAlloc = (MemAllocChunk *)malloc(iTotalSize); //(unsigned int *)LocalAlloc (LMEM_FIXED, iSize + 8);
if (! pAlloc) { SVSUTIL_ASSERT (0); return NULL; }
unsigned int __RetAddr = 0;
#if defined (_X86_)
__asm { mov eax, [ebp+4] mov __RetAddr, eax }; #endif
pAlloc->uiSignature1 = 'SVSA'; pAlloc->uiSignature2 = 'LLOC'; pAlloc->uiSize = (unsigned int)iSize; pAlloc->uiCalledFrom = __RetAddr; pAlloc->pPrev = NULL;
EnterCriticalSection (&csGlobalAlloc); if (pAllocBlocks) pAllocBlocks->pPrev = pAlloc;
pAlloc->pNext = pAllocBlocks; pAllocBlocks = pAlloc; uiMemAllocated += iSize; LeaveCriticalSection (&csGlobalAlloc);
return(void *)pAlloc->data; #else
return malloc (iSize); // LocalAlloc (LMEM_FIXED, iSize);
#endif
}
void svsutil_Free (void *pvPtr, void *pvData) { SVSUTIL_ASSERT (pvPtr); SVSUTIL_ASSERT (pvData == g_pvFreeData);
#if (defined (_WINDOWS_) || defined (_WINDOWS_CE_)) && defined (SVSUTIL_DEBUG_HEAP)
MemAllocChunk *pAlloc = (MemAllocChunk *)((unsigned char *)pvPtr - offsetof(MemAllocChunk, data));
SVSUTIL_ASSERT (pAlloc->uiSignature1 == 'SVSA'); SVSUTIL_ASSERT (pAlloc->uiSignature2 == 'LLOC'); EnterCriticalSection (&csGlobalAlloc); if (! pAlloc->pPrev) { SVSUTIL_ASSERT (pAlloc == pAllocBlocks); pAllocBlocks = pAlloc->pNext; if (pAllocBlocks) pAllocBlocks->pPrev = NULL; } else { SVSUTIL_ASSERT (pAlloc != pAllocBlocks); pAlloc->pPrev->pNext = pAlloc->pNext; if (pAlloc->pNext) pAlloc->pNext->pPrev = pAlloc->pPrev; }
unsigned int __RetAddr = 0;
#if defined (_X86_)
__asm { mov eax, [ebp+4] mov __RetAddr, eax }; #endif
uiMemAllocated -= pAlloc->uiSize; LeaveCriticalSection (&csGlobalAlloc); pAlloc->pNext = NULL; pAlloc->pPrev = NULL; pAlloc->uiSignature1 = 0; pAlloc->uiSignature2 = 0; pAlloc->uiCalledFrom = __RetAddr;
pvPtr = (void *)pAlloc; #endif
// HLOCAL hres = LocalFree (pvPtr);
// SVSUTIL_ASSERT (! hres);
free (pvPtr); }
void svsutil_SetAlloc (FuncAlloc a_funcAlloc, FuncFree a_funcFree) { g_funcAlloc = a_funcAlloc ? a_funcAlloc : svsutil_Alloc; g_funcFree = a_funcFree ? a_funcFree : svsutil_Free; }
void svsutil_SetAllocData (void *a_pvAllocData, void *a_pvFreeData) { g_pvAllocData = a_pvAllocData; g_pvFreeData = a_pvFreeData; }
|