You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.5 KiB
121 lines
4.5 KiB
//========= 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
|
|
|