windows-nt/Source/XPSP1/NT/enduser/stuff/hhctrl/lcmem.cpp
2020-09-26 16:20:57 +08:00

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