diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /gcsdk/bufferpool.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'gcsdk/bufferpool.cpp')
| -rw-r--r-- | gcsdk/bufferpool.cpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/gcsdk/bufferpool.cpp b/gcsdk/bufferpool.cpp new file mode 100644 index 0000000..f1c2f82 --- /dev/null +++ b/gcsdk/bufferpool.cpp @@ -0,0 +1,120 @@ +//========= Copyright �, Valve LLC, All rights reserved. ====================== +// +// Purpose: Defines a buffer pool used to group small allocations +// +//============================================================================= + + +#include "stdafx.h" +#include "bufferpool.h" + +using namespace GCSDK; + +CUtlVector<CBufferPool *> CBufferPool::sm_vecBufferPools; + + +//---------------------------------------------------------------------------- +// Purpose: Constructor +//---------------------------------------------------------------------------- +CBufferPool::CBufferPool( const char *pchName, const GCConVar &cvMaxSizeMB, const GCConVar &cvInitBufferSize, int nFlags ) + : m_nBuffersInUse( 0 ) + , m_nBuffersTotal( 0 ) + , m_nHighWatermark( 0 ) + , m_cubFree( 0 ) + , m_sName( pchName ) + , m_cvMaxSizeMB( cvMaxSizeMB ) + , m_cvInitBufferSize( cvInitBufferSize ) + , m_nFlags( nFlags ) +{ + sm_vecBufferPools.AddToTail( this ); +} + + +//---------------------------------------------------------------------------- +// Purpose: Destructor +//---------------------------------------------------------------------------- +CBufferPool::~CBufferPool() +{ + m_vecFreeBuffers.PurgeAndDeleteElements(); + sm_vecBufferPools.FindAndRemove( this ); +} + + +//---------------------------------------------------------------------------- +// Purpose: Gives a bind param buffer to a query +//---------------------------------------------------------------------------- +CUtlBuffer *CBufferPool::GetBuffer() +{ + m_nBuffersInUse++; + + if ( m_vecFreeBuffers.Count() > 0 ) + { + CUtlBuffer *pBuffer = m_vecFreeBuffers.Tail(); + m_vecFreeBuffers.Remove( m_vecFreeBuffers.Count() - 1 ); + m_cubFree -= pBuffer->Size(); + + return pBuffer; + } + else + { + m_nBuffersTotal++; + m_nHighWatermark = max( m_nBuffersTotal, m_nHighWatermark ); + return new CUtlBuffer( 0, m_cvInitBufferSize.GetInt(), m_nFlags ); + } +} + + +//---------------------------------------------------------------------------- +// Purpose: Returns a bind param buffer when a query is done with it +//---------------------------------------------------------------------------- +void CBufferPool::ReturnBuffer( CUtlBuffer *pBuffer ) +{ + m_nBuffersInUse--; + + if ( ( int64 )( m_cubFree + pBuffer->Size() ) <= ( m_cvMaxSizeMB.GetInt() * k_nMegabyte ) ) + { + pBuffer->Clear(); + m_cubFree += pBuffer->Size(); + m_vecFreeBuffers.AddToTail( pBuffer ); + } + else + { + m_nBuffersTotal--; + delete pBuffer; + } +} + + +//---------------------------------------------------------------------------- +// Purpose: Print statistics to the console +//---------------------------------------------------------------------------- +void CBufferPool::DumpPools() +{ + EmitInfo( SPEW_CONSOLE, SPEW_ALWAYS, LOG_ALWAYS, "Reusable Buffer Pools:\n" ); + EmitInfo( SPEW_CONSOLE, SPEW_ALWAYS, LOG_ALWAYS, + " Pool Buffers Free Max Buffers Total Mem (est) Free Mem\n" ); + EmitInfo( SPEW_CONSOLE, SPEW_ALWAYS, LOG_ALWAYS, + " ------------------------------ ------------ ------------ ------------ ---------------- ----------------\n" ); + + FOR_EACH_VEC( sm_vecBufferPools, i ) + { + CBufferPool *pPool = sm_vecBufferPools[i]; + + int nTotalEst = 0; + if ( pPool->m_vecFreeBuffers.Count() > 0 ) + { + nTotalEst = pPool->m_cubFree / pPool->m_vecFreeBuffers.Count() * pPool->m_nBuffersTotal; + } + + EmitInfo( SPEW_CONSOLE, SPEW_ALWAYS, LOG_ALWAYS, " %-30s %12d %12d %12d %16s %16s\n", + pPool->m_sName.Get(), + pPool->m_nBuffersTotal, + pPool->m_vecFreeBuffers.Count(), + pPool->m_nHighWatermark, + Q_pretifymem( nTotalEst, 0, true ), + Q_pretifymem( pPool->m_cubFree, 0, true ) + ); + } + + EmitInfo( SPEW_CONSOLE, SPEW_ALWAYS, LOG_ALWAYS, "\n" ); +} |