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