13d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "dmAllocatedPointersPool.h" 23d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <malloc.h> 33d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <stdlib.h> 43d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <assert.h> 53d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include <stdio.h> 63d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "xpl_Logger.h" 73d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#include "dmMemory.h" 83d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 93d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby/* 103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid* DmtMemAllocEx( size_t nSize, CPCHAR szFile, INT32 nLine ) 113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return DmAllocMemEx( nSize, szFile, nLine ); 133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid DmtMemFree( void* p ) 163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby DmFreeMem( p ); 183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby*/ 203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DEBUG 223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake HambyDMAllocatedPointersPool *s_pAllocatedPool = new DMAllocatedPointersPool; 233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby// SU API functions - only used in SyncML DM code 253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyconst int c_nMemPrefix = 3*sizeof(const char*) + DMAllocatedPointersPool::c_nExtraBytes; 263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyconst int c_nMemPostfix = DMAllocatedPointersPool::c_nExtraBytes; 273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby//#define MEASURE_MEMORY 303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DM_MEMORY_STATISTICS_ENABLED 313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint g_nMaxMem = 0; 323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint g_nCurMem = 0; 333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint g_nNumber = 0; 343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid DmMemoryStatisticsWrite(const char* header) 363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid DmMemoryStatisticsReportLeaks( void ) 403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint DmGetMemFailedFlag( void ) 463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return 0; 483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid DmResetMemFailedFlag( void ) 503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DEBUG 543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint s_nBlocks = 0, s_nSize = 0; 563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyint s_nCnt = 0; 573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid* DmAllocMemEx(UINT32 bufsize, CPCHAR szFile, int nLine ) 613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_nBlocks ++; 633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_nSize += (bufsize + 3) / 4 * 4; 643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby // emulate low memory case 663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby static int s_nFirstBlocks = 4*1024 +1; 673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_nCnt++; 693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( !s_nFirstBlocks ) { 713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( (s_nCnt % 1024) == 0) 723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ; //return NULL; 733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_nFirstBlocks--; 763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( (s_nCnt % 102400) == 0 ) 793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby XPL_LOG_DM_TMN_Debug(("Total blocks %d, Blocks %d, size %d\n\n", s_nCnt, s_nBlocks, s_nSize )); 813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby char* ptr = (char*)malloc(bufsize + c_nMemPrefix + c_nMemPostfix); 853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (ptr == 0) 863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby XPL_LOG_DM_TMN_Debug(("Malloc failed. Memory not available. %d asked by %s In %d. \n", 883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby bufsize,szFile, nLine)); 893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby assert(0); 903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DM_MEMORY_STATISTICS_ENABLED 943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nCurMem += (bufsize + 3) / 4 * 4; 953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nMaxMem = (g_nMaxMem > g_nCurMem ? g_nMaxMem : g_nCurMem); 963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nNumber++; 973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_pAllocatedPool->append(ptr); 1003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby memset(ptr,0xcd,bufsize + c_nMemPrefix + c_nMemPostfix); 1013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby CPCHAR* ppStr = (CPCHAR*)ptr; 1033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ppStr[0] = strdup( szFile ); 1043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ppStr[1] = (CPCHAR)nLine; 1053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ppStr[2] = (CPCHAR)(long)bufsize; 1063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ptr += c_nMemPrefix; 1083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby memset(ptr,0,bufsize); 1093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby XPL_LOG_DM_TMN_Debug(("Allocating %d memory at %p in file %s In %d. \n", 1103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby bufsize, ptr, szFile, nLine)); 1113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return(ptr); 1133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 1143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid DmFreeMemEx(void *ptr, CPCHAR szFile, int nLine) 1163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 1173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby unsigned char* bufptr = (unsigned char*)ptr; 1183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if(bufptr != 0 ){ 1193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby bufptr -= c_nMemPrefix; 1203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( s_pAllocatedPool->remove(bufptr)) { 1223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby // check over/under run of the buffer 1233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby bool bCorrupted = false; 1243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby CPCHAR* ppStr = (CPCHAR*)bufptr; 1253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby for ( int i = 1; i <= DMAllocatedPointersPool::c_nExtraBytes; i++ ) 1263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 1273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( bufptr[c_nMemPrefix-i] != 0xcd || 1283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby bufptr[c_nMemPrefix + (int)ppStr[2] + i - 1] != 0xcd ) 1293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby bCorrupted = true; 1303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_nBlocks --; 1333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_nSize -= ((int)ppStr[2] + 3) / 4 * 4; 1343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DM_MEMORY_STATISTICS_ENABLED 1353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nCurMem -= ((int)ppStr[2] + 3) / 4 * 4; 1363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nNumber--; 1373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 1383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( bCorrupted ) 1403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 1413d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby XPL_LOG_DM_TMN_Debug(("Block has been corrupted with writing before/after the allocated block; pointer %p; file %c ln. %d size %d \n", 1423d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby (void*) (bufptr + c_nMemPrefix), ppStr[0], (int) ppStr[1], (int) ppStr[2])); 1433d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1443d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby free( (void*)ppStr[0] ); 1453d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby memset(ptr, 0xcd, (int)ppStr[2] ); 1463d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby free(bufptr); 1473d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1483d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby else 1493d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 1503d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby XPL_LOG_DM_TMN_Debug(("Invalid or duplicate freeing %p memory. infile %s ln. %d \n", 1513d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby (void*) (bufptr + c_nMemPrefix), szFile, nLine)); 1523d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1533d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1543d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 1553d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1563d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid* DmReallocMem( void* ptr, int nSize ) 1573d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 1583d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby // debug version: 1593d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1603d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nSize <= 0 ){ 1613d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby DmFreeMem( ptr ); 1623d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return NULL; 1633d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1643d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1653d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( !ptr ) 1663d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return DmAllocMem( nSize ); 1673d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1683d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby // check for buf size - if it registered... 1693d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby unsigned char* bufptr = (unsigned char*)ptr; 1703d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if(bufptr != 0 ) 1713d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby bufptr -= c_nMemPrefix; 1723d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1733d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( !s_pAllocatedPool->exists(bufptr)) 1743d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby { 1753d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby // invalid input parameter!!! 1763d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby XPL_LOG_DM_TMN_Debug(("Realloc is called with invalid input parameter: block %p was not allocated or already was freed \n", 1773d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby (void*) (bufptr + c_nMemPrefix))); 1783d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return DmAllocMem( nSize ); 1793d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 1803d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1813d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby CPCHAR* ppStr = (CPCHAR*)bufptr; 1823d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby int nBlockSize = (int)ppStr[2]; 1833d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1843d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( nBlockSize >= nSize ) 1853d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return ptr; // nothing to do - current block is large enough 1863d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1873d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby void* pNewBlock = DmAllocMem( nSize ); 1883d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1893d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if ( pNewBlock ) 1903d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby memcpy( pNewBlock, ptr,(nBlockSize < nSize ? nBlockSize : nSize) ); 1913d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1923d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby DmFreeMem(ptr); 1933d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return pNewBlock; 1943d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 1953d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1963d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#else //!DEBUG 1973d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 1983d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid* DmReallocMem(void *ptr, int nSize) 1993d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 2003d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return realloc(ptr,nSize); 2013d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 2023d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2033d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid * DmAllocMemEx(UINT32 bufsize, CPCHAR szFile, int nLine ) 2043d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 2053d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby char* ptr = (char*)malloc(bufsize); 2063d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (ptr != 0) { 2073d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby memset(ptr,0,bufsize); 2083d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } else { 2093d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby abort(); 2103d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 2113d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby return ptr; 2123d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 2133d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2143d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyvoid DmFreeMemEx(void *ptr, CPCHAR szFile, int nLine) 2153d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 2163d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby if (ptr) { 2173d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby free( ptr ); 2183d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 2193d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 2203d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2213d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif //DEBUG 2223d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2233d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2243d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DM_MEMORY_STATISTICS_ENABLED 2253d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambyextern "C" void suPrintMemoryUsage() 2263d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 2273d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby XPL_LOG_DM_TMN_Debug(("Memory usage summary: allocated %d block(s) with total %d bytes. Max usage was %d \n", 2283d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby g_nNumber, g_nCurMem, g_nMaxMem)); 2293d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby} 2303d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 2313d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 2323d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#ifdef DEBUG 2333d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hambystruct CMemoryStatusPrint 2343d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby{ 2353d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby ~CMemoryStatusPrint() { 2363d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby s_pAllocatedPool->PrintUnreleased(); 2373d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby } 2383d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby}s_oMemoryStatus; 2393d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby#endif 2403d91e7ce47853dc4e6ec7e1fc675c3d1585e3c51Jake Hamby 241