/*****************************************************************/ /** Microsoft Windows for Workgroups **/ /** Copyright (C) Microsoft Corp., 1991-1992 **/ /*****************************************************************/ /* alloc.c -- * * History: * 10/06/93 gregj Created. * 11/29/93 gregj Added debug instrumentation. * */ #include "npcommon.h" #include #include //====== Memory allocation functions ================================= // Alloc a chunk of memory, quickly, with no 64k limit on size of // individual objects or total object size. // void * WINAPI MemAlloc(long cb) { return (void *)::LocalAlloc(LPTR, cb); } // Realloc one of above. If pb is NULL, then this function will do // an alloc for you. // void * WINAPI MemReAlloc(void * pb, long cb) { if (pb == NULL) return ::MemAlloc(cb); return (void *)::LocalReAlloc((HLOCAL)pb, cb, LMEM_MOVEABLE | LMEM_ZEROINIT); } // Free a chunk of memory alloced or realloced with above routines. // BOOL WINAPI MemFree(void * pb) { return ::LocalFree((HLOCAL)pb) ? TRUE : FALSE; } #ifdef DEBUG MEMWATCH::MEMWATCH(LPCSTR lpszLabel) : _lpszLabel(lpszLabel) { _info.pNext = NULL; _info.cAllocs = 0; _info.cFrees = 0; _info.cbAlloc = 0; _info.cbMaxAlloc = 0; _info.cbTotalAlloc = 0; fStats = TRUE; MemRegisterWatcher(&_info); } MEMWATCH::~MEMWATCH() { MemDeregisterWatcher(&_info); if (fStats || ((_info.cAllocs - _info.cFrees) != 0)) { if (!fStats) { OutputDebugString("Memory leak: "); } OutputDebugString(_lpszLabel); char szBuf[100]; wsprintf(szBuf, "%d allocs, %d orphans, %d byte footprint, %d byte usage\r\n", _info.cAllocs, _info.cAllocs - _info.cFrees, _info.cbMaxAlloc, _info.cbTotalAlloc); OutputDebugString(szBuf); } } MemLeak::MemLeak(LPCSTR lpszLabel) : MEMWATCH(lpszLabel) { fStats = FALSE; } MemOff::MemOff() { pvContext = MemUpdateOff(); } MemOff::~MemOff() { MemUpdateContinue(pvContext); } #endif /* DEBUG */