//========= 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