mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
122 lines
4.5 KiB
C++
122 lines
4.5 KiB
C++
//========= 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
|