source-engine/gcsdk/steamextra/misc.h

122 lines
4.5 KiB
C
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Miscellaneous platform-specific code
//
//=============================================================================
#ifndef MISC_H
#define MISC_H
// Random number utilities
uint32 UNRandFast();
char CHRandFast();
void SetRandSeed( uint64 ulRandSeed );
uint64 GetRandSeed();
void RandMem(void *dest, int count);
bool IsVTTAccountName( const char *szAccountName );
float SafeCalcPct( uint64 ulNumerator, uint64 ulDenominator );
bool BRejectDueToBacklog( int nBacklogCur, int nBacklogThreshold, int nBacklogLimit, int iItem );
#define SAFE_CLOSE_HANDLE( x ) if ( INVALID_HANDLE_VALUE != ( x ) ) { CloseHandle( x ); ( x ) = INVALID_HANDLE_VALUE; }
#define SAFE_DELETE( x ) if ( NULL != ( x ) ) { delete ( x ); ( x ) = NULL; }
#define SAFE_CLOSE_HCONNECTION( x ) if ( 0 != ( x ) ) { CNet::BClose( ( x ) ); ( x ) = 0; }
#define SAFE_RELEASE( x ) if ( NULL != ( x ) ) { ( x )->Release(); x = NULL; }
#define DECLARE_STEAM_CLASS_SIMPLE( className, baseClassName ) \
typedef baseClassName BaseClass; \
typedef className ThisClass; \
#define DECLARE_STEAM_CLASS_NOBASE( className ) \
typedef className ThisClass; \
// Type for our memory output debugging.
class IDisplayMemPoolStats
{
public:
virtual void Display( const char *pszClassName, uint64 ulClassSize, uint32 unPoolInstanceCount, uint64 ulPoolMemoryUsage, uint32 unPoolPeakInstanceCount, uint64 ulPoolPeakMemoryUsage ) = 0;
};
// A class for registering functions that will print memory usage information
typedef void (*DumpMemFn_t)( IDisplayMemPoolStats * );
class CDumpMemFnReg
{
public:
static CDumpMemFnReg *sm_Head;
CDumpMemFnReg( DumpMemFn_t fn )
: m_fn( fn ),
m_pNext( sm_Head )
{
sm_Head = this;
}
DumpMemFn_t m_fn;
CDumpMemFnReg *m_pNext;
};
// Helper macros for creating and using CClassMemoryPool on our frequently allocated objects
#define DECLARE_CLASS_MEMPOOL( className ) \
private: \
static CUtlMemoryPool sm_classMemPool; \
public: \
static void* operator new ( size_t nSize ); \
static void* operator new ( size_t nSize, int nBlockUse, const char *pFileName, int nLine ); \
static void operator delete ( void *pMem ); \
static void DumpMemStats( IDisplayMemPoolStats *pDisplayer ); \
#define IMPLEMENT_CLASS_MEMPOOL( className, initSize, growMode ) \
CUtlMemoryPool className::sm_classMemPool( sizeof( className ), ( initSize ), ( growMode ), MEM_ALLOC_CLASSNAME( className ) ); \
\
void* className::operator new ( size_t nSize ) \
{ \
if ( nSize != sizeof( className ) ) \
{ \
EmitError( SPEW_CONSOLE, #className"::operator new() called on wrong size! Expected %llu, Got %llu\n", (uint64)sizeof( className ), (uint64)nSize ); \
return NULL; \
} \
\
return sm_classMemPool.Alloc(); \
} \
\
void* className::operator new ( size_t nSize, int nBlockUse, const char *pFileName, int nLine ) \
{ \
if ( nSize != sizeof( className ) ) \
{ \
EmitError( SPEW_CONSOLE, #className"::operator new() called on wrong size! Expected %llu, Got %llu\n", (uint64)sizeof( className ), (uint64)nSize ); \
return NULL; \
} \
\
return sm_classMemPool.Alloc(); \
} \
\
void className::operator delete ( void *pMem ) \
{ \
sm_classMemPool.Free( (className *)pMem ); \
} \
\
void className::DumpMemStats( IDisplayMemPoolStats *pDisplayer ) \
{ \
Assert( pDisplayer ); \
pDisplayer->Display \
( \
#className, \
sizeof( className ), \
sm_classMemPool.Count(), \
sm_classMemPool.Count() * sizeof( className ), \
( ( sm_classMemPool.PeakCount() + ( initSize ) ) / ( initSize ) ) * ( initSize ) , \
( ( sm_classMemPool.PeakCount() + ( initSize ) ) / ( initSize ) ) * ( initSize ) * sizeof( className ) \
); \
} \
\
static CDumpMemFnReg s_##className##RegDumpMemory( &className::DumpMemStats );
// useful macro for rendering an IP
#define iptod(x) ((x)>>24&0xff), ((x)>>16&0xff), ((x)>>8&0xff), ((x)&0xff)
#endif // MISC_H