177 lines
3.6 KiB
C++
177 lines
3.6 KiB
C++
|
// Copyright (C) 1994-1997 Microsoft Corporation. All rights reserved.
|
||
|
|
||
|
#include "header.h"
|
||
|
|
||
|
// our lame workshop relies on the old exported memory functions
|
||
|
// so we have to keep exporting these but we will now implement these
|
||
|
// using the CRT heap
|
||
|
//
|
||
|
|
||
|
#ifdef HHA
|
||
|
|
||
|
#undef lcSize
|
||
|
|
||
|
int STDCALL lcSize(void* pv)
|
||
|
{
|
||
|
return _msize(pv);
|
||
|
}
|
||
|
|
||
|
void* STDCALL rcalloc(int cb)
|
||
|
{
|
||
|
void* pv = lcMalloc( cb );
|
||
|
memset( pv, 0, cb );
|
||
|
return pv;
|
||
|
}
|
||
|
|
||
|
void STDCALL rfree(void* pv)
|
||
|
{
|
||
|
lcFree( pv );
|
||
|
}
|
||
|
|
||
|
void STDCALL rclearfree(void** pv)
|
||
|
{
|
||
|
lcFree( *pv );
|
||
|
*pv = NULL;
|
||
|
}
|
||
|
|
||
|
void STDCALL rheapcheck()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void* STDCALL rmalloc(int cb)
|
||
|
{
|
||
|
return lcMalloc( cb );
|
||
|
}
|
||
|
|
||
|
void* STDCALL rrealloc(void* pv, int cb)
|
||
|
{
|
||
|
return lcReAlloc( pv, cb );
|
||
|
}
|
||
|
|
||
|
#define lcSize(pv) _msize(pv)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef THIS_FILE
|
||
|
static const char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
PSTR lcStrDup(PCSTR psz)
|
||
|
{
|
||
|
if (!psz)
|
||
|
psz = "";
|
||
|
PSTR pszDup = (PSTR) lcMalloc(strlen(psz) + 1);
|
||
|
return strcpy(pszDup, psz);
|
||
|
}
|
||
|
|
||
|
PWSTR lcStrDupW(PCWSTR psz)
|
||
|
{
|
||
|
if (!psz)
|
||
|
psz = L"";
|
||
|
int cb = (lstrlenW(psz)*sizeof(WCHAR)) + sizeof(WCHAR);
|
||
|
PWSTR pszDup = (PWSTR) lcMalloc(cb);
|
||
|
if (pszDup)
|
||
|
CopyMemory(pszDup, psz, cb);
|
||
|
return pszDup;
|
||
|
}
|
||
|
|
||
|
|
||
|
CMem::CMem(void)
|
||
|
{
|
||
|
pb = NULL;
|
||
|
#ifndef HHCTRL
|
||
|
psz = (PSTR) pb;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
CMem::CMem(int size)
|
||
|
{
|
||
|
_ASSERT(size > 0);
|
||
|
pb = (PBYTE) lcMalloc(size);
|
||
|
#ifndef HHCTRL
|
||
|
psz = (PSTR) pb;
|
||
|
#endif
|
||
|
_ASSERT(pb);
|
||
|
};
|
||
|
|
||
|
#ifndef HHCTRL
|
||
|
int CMem::size(void) { return lcSize(pb); }
|
||
|
void CMem::resize(int cb) { ReAlloc(cb); }
|
||
|
#endif
|
||
|
|
||
|
#ifdef HHCTRL
|
||
|
#if _DEBUG
|
||
|
///////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// The new heap status report...
|
||
|
//
|
||
|
|
||
|
// Following variables defined in CTable.cpp, _DEBUG only
|
||
|
|
||
|
extern int g_cbTableAllocated;
|
||
|
extern int g_cbTableReserved;
|
||
|
extern int g_cTables;
|
||
|
|
||
|
void OnReportMemoryUsage(void)
|
||
|
{
|
||
|
// Get the current memory state.
|
||
|
_CrtMemState NewMemState ;
|
||
|
_CrtMemCheckpoint(&NewMemState) ;
|
||
|
|
||
|
char buf[4096] ;
|
||
|
wsprintf(buf,
|
||
|
"\tBlocks\tBytes\r\n\t------\t-----\r\n"
|
||
|
"Free: \t%12ld\t%12ld\r\n"
|
||
|
"Normal:\t%12ld\t%12ld\r\n"
|
||
|
"CRT: \t%12ld\t%12ld\r\n"
|
||
|
"Ignore:\t%12ld\t%12ld\r\n"
|
||
|
"Client: \t%12ld\t%12ld\r\n\r\n"
|
||
|
"Largest Used: %ld\r\n"
|
||
|
"Total Allocations: %ld\r\n\r\nTables (%u): %d bytes\r\n"
|
||
|
"Reserved: %d megs",
|
||
|
NewMemState.lCounts[0], NewMemState.lSizes[0],
|
||
|
NewMemState.lCounts[1], NewMemState.lSizes[1],
|
||
|
NewMemState.lCounts[2], NewMemState.lSizes[2],
|
||
|
NewMemState.lCounts[3], NewMemState.lSizes[3],
|
||
|
NewMemState.lCounts[4], NewMemState.lSizes[4],
|
||
|
NewMemState.lHighWaterCount,
|
||
|
NewMemState.lTotalCount,
|
||
|
g_cTables, g_cbTableAllocated, g_cbTableReserved / (1024*1024)) ;
|
||
|
MsgBox(buf);
|
||
|
|
||
|
// Dump it to the debug output.
|
||
|
_CrtMemDumpStatistics(&NewMemState);
|
||
|
}
|
||
|
///////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// This class is used to initialize the CRT debug code.
|
||
|
//
|
||
|
class DebugAutoInitializer
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
//--- Place code to initialize the CRT debug code here.
|
||
|
DebugAutoInitializer()
|
||
|
{
|
||
|
// Turn own automatic leak checking.
|
||
|
int f = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) ;
|
||
|
f |= _CRTDBG_LEAK_CHECK_DF ;
|
||
|
_CrtSetDbgFlag(f) ;
|
||
|
|
||
|
//--- LineNumber to break on... (found in hhdebug.ini file)
|
||
|
long BreakNumber = GetPrivateProfileInt( "CRT", "_CrtSetBreakAlloc", 0, "hhdebug.ini" );
|
||
|
if (BreakNumber)
|
||
|
{
|
||
|
_CrtSetBreakAlloc(BreakNumber) ;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
};
|
||
|
|
||
|
DebugAutoInitializer s_DebugAutoInitializer;
|
||
|
|
||
|
#endif // _DEBUG
|
||
|
#endif // HHCTRL
|