aboutsummaryrefslogtreecommitdiff
path: root/mp/src/tier1/datamanager.cpp
diff options
context:
space:
mode:
authorJørgen P. Tjernø <[email protected]>2013-12-02 19:31:46 -0800
committerJørgen P. Tjernø <[email protected]>2013-12-02 19:46:31 -0800
commitf56bb35301836e56582a575a75864392a0177875 (patch)
treede61ddd39de3e7df52759711950b4c288592f0dc /mp/src/tier1/datamanager.cpp
parentMark some more files as text. (diff)
downloadsource-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz
source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/tier1/datamanager.cpp')
-rw-r--r--mp/src/tier1/datamanager.cpp822
1 files changed, 411 insertions, 411 deletions
diff --git a/mp/src/tier1/datamanager.cpp b/mp/src/tier1/datamanager.cpp
index c81fc150..0a8134f8 100644
--- a/mp/src/tier1/datamanager.cpp
+++ b/mp/src/tier1/datamanager.cpp
@@ -1,411 +1,411 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//
-//=============================================================================//
-
-#include "basetypes.h"
-#include "datamanager.h"
-
-DECLARE_POINTER_HANDLE( memhandle_t );
-
-#define AUTO_LOCK_DM() AUTO_LOCK_( CDataManagerBase, *this )
-
-CDataManagerBase::CDataManagerBase( unsigned int maxSize )
-{
- m_targetMemorySize = maxSize;
- m_memUsed = 0;
- m_lruList = m_memoryLists.CreateList();
- m_lockList = m_memoryLists.CreateList();
- m_freeList = m_memoryLists.CreateList();
- m_listsAreFreed = 0;
-}
-
-CDataManagerBase::~CDataManagerBase()
-{
- Assert( m_listsAreFreed );
-}
-
-void CDataManagerBase::NotifySizeChanged( memhandle_t handle, unsigned int oldSize, unsigned int newSize )
-{
- Lock();
- m_memUsed += (int)newSize - (int)oldSize;
- Unlock();
-}
-
-void CDataManagerBase::SetTargetSize( unsigned int targetSize )
-{
- m_targetMemorySize = targetSize;
-}
-
-unsigned int CDataManagerBase::FlushAllUnlocked()
-{
- Lock();
-
- int nFlush = m_memoryLists.Count( m_lruList );
- void **pScratch = (void **)_alloca( nFlush * sizeof(void *) );
- CUtlVector<void *> destroyList( pScratch, nFlush );
-
- unsigned nBytesInitial = MemUsed_Inline();
-
- int node = m_memoryLists.Head(m_lruList);
- while ( node != m_memoryLists.InvalidIndex() )
- {
- int next = m_memoryLists.Next(node);
- m_memoryLists.Unlink( m_lruList, node );
- destroyList.AddToTail( GetForFreeByIndex( node ) );
- node = next;
- }
-
- Unlock();
-
- for ( int i = 0; i < nFlush; i++ )
- {
- DestroyResourceStorage( destroyList[i] );
- }
-
- return ( nBytesInitial - MemUsed_Inline() );
-}
-
-unsigned int CDataManagerBase::FlushToTargetSize()
-{
- return EnsureCapacity(0);
-}
-
-// Frees everything! The LRU AND the LOCKED items. This is only used to forcibly free the resources,
-// not to make space.
-
-unsigned int CDataManagerBase::FlushAll()
-{
- Lock();
-
- int nFlush = m_memoryLists.Count( m_lruList ) + m_memoryLists.Count( m_lockList );
- void **pScratch = (void **)_alloca( nFlush * sizeof(void *) );
- CUtlVector<void *> destroyList( pScratch, nFlush );
-
- unsigned result = MemUsed_Inline();
- int node;
- int nextNode;
-
- node = m_memoryLists.Head(m_lruList);
- while ( node != m_memoryLists.InvalidIndex() )
- {
- nextNode = m_memoryLists.Next(node);
- m_memoryLists.Unlink( m_lruList, node );
- destroyList.AddToTail( GetForFreeByIndex( node ) );
- node = nextNode;
- }
-
- node = m_memoryLists.Head(m_lockList);
- while ( node != m_memoryLists.InvalidIndex() )
- {
- nextNode = m_memoryLists.Next(node);
- m_memoryLists.Unlink( m_lockList, node );
- m_memoryLists[node].lockCount = 0;
- destroyList.AddToTail( GetForFreeByIndex( node ) );
- node = nextNode;
- }
-
- m_listsAreFreed = false;
- Unlock();
-
- for ( int i = 0; i < nFlush; i++ )
- {
- DestroyResourceStorage( destroyList[i] );
- }
-
- return result;
-}
-
-unsigned int CDataManagerBase::Purge( unsigned int nBytesToPurge )
-{
- unsigned int nTargetSize = MemUsed_Inline() - nBytesToPurge;
- // Check for underflow
- if ( MemUsed_Inline() < nBytesToPurge )
- nTargetSize = 0;
- unsigned int nImpliedCapacity = MemTotal_Inline() - nTargetSize;
- return EnsureCapacity( nImpliedCapacity );
-}
-
-
-void CDataManagerBase::DestroyResource( memhandle_t handle )
-{
- Lock();
- unsigned short index = FromHandle( handle );
- if ( !m_memoryLists.IsValidIndex(index) )
- {
- Unlock();
- return;
- }
-
- Assert( m_memoryLists[index].lockCount == 0 );
- if ( m_memoryLists[index].lockCount )
- BreakLock( handle );
- m_memoryLists.Unlink( m_lruList, index );
- void *p = GetForFreeByIndex( index );
- Unlock();
-
- DestroyResourceStorage( p );
-}
-
-
-void *CDataManagerBase::LockResource( memhandle_t handle )
-{
- AUTO_LOCK_DM();
- unsigned short memoryIndex = FromHandle(handle);
- if ( memoryIndex != m_memoryLists.InvalidIndex() )
- {
- if ( m_memoryLists[memoryIndex].lockCount == 0 )
- {
- m_memoryLists.Unlink( m_lruList, memoryIndex );
- m_memoryLists.LinkToTail( m_lockList, memoryIndex );
- }
- Assert(m_memoryLists[memoryIndex].lockCount != (unsigned short)-1);
- m_memoryLists[memoryIndex].lockCount++;
- return m_memoryLists[memoryIndex].pStore;
- }
-
- return NULL;
-}
-
-int CDataManagerBase::UnlockResource( memhandle_t handle )
-{
- AUTO_LOCK_DM();
- unsigned short memoryIndex = FromHandle(handle);
- if ( memoryIndex != m_memoryLists.InvalidIndex() )
- {
- Assert( m_memoryLists[memoryIndex].lockCount > 0 );
- if ( m_memoryLists[memoryIndex].lockCount > 0 )
- {
- m_memoryLists[memoryIndex].lockCount--;
- if ( m_memoryLists[memoryIndex].lockCount == 0 )
- {
- m_memoryLists.Unlink( m_lockList, memoryIndex );
- m_memoryLists.LinkToTail( m_lruList, memoryIndex );
- }
- }
- return m_memoryLists[memoryIndex].lockCount;
- }
-
- return 0;
-}
-
-void *CDataManagerBase::GetResource_NoLockNoLRUTouch( memhandle_t handle )
-{
- AUTO_LOCK_DM();
- unsigned short memoryIndex = FromHandle(handle);
- if ( memoryIndex != m_memoryLists.InvalidIndex() )
- {
- return m_memoryLists[memoryIndex].pStore;
- }
- return NULL;
-}
-
-
-void *CDataManagerBase::GetResource_NoLock( memhandle_t handle )
-{
- AUTO_LOCK_DM();
- unsigned short memoryIndex = FromHandle(handle);
- if ( memoryIndex != m_memoryLists.InvalidIndex() )
- {
- TouchByIndex( memoryIndex );
- return m_memoryLists[memoryIndex].pStore;
- }
- return NULL;
-}
-
-void CDataManagerBase::TouchResource( memhandle_t handle )
-{
- AUTO_LOCK_DM();
- TouchByIndex( FromHandle(handle) );
-}
-
-void CDataManagerBase::MarkAsStale( memhandle_t handle )
-{
- AUTO_LOCK_DM();
- unsigned short memoryIndex = FromHandle(handle);
- if ( memoryIndex != m_memoryLists.InvalidIndex() )
- {
- if ( m_memoryLists[memoryIndex].lockCount == 0 )
- {
- m_memoryLists.Unlink( m_lruList, memoryIndex );
- m_memoryLists.LinkToHead( m_lruList, memoryIndex );
- }
- }
-}
-
-int CDataManagerBase::BreakLock( memhandle_t handle )
-{
- AUTO_LOCK_DM();
- unsigned short memoryIndex = FromHandle(handle);
- if ( memoryIndex != m_memoryLists.InvalidIndex() && m_memoryLists[memoryIndex].lockCount )
- {
- int nBroken = m_memoryLists[memoryIndex].lockCount;
- m_memoryLists[memoryIndex].lockCount = 0;
- m_memoryLists.Unlink( m_lockList, memoryIndex );
- m_memoryLists.LinkToTail( m_lruList, memoryIndex );
-
- return nBroken;
- }
- return 0;
-}
-
-int CDataManagerBase::BreakAllLocks()
-{
- AUTO_LOCK_DM();
- int nBroken = 0;
- int node;
- int nextNode;
-
- node = m_memoryLists.Head(m_lockList);
- while ( node != m_memoryLists.InvalidIndex() )
- {
- nBroken++;
- nextNode = m_memoryLists.Next(node);
- m_memoryLists[node].lockCount = 0;
- m_memoryLists.Unlink( m_lockList, node );
- m_memoryLists.LinkToTail( m_lruList, node );
- node = nextNode;
- }
-
- return nBroken;
-
-}
-
-unsigned short CDataManagerBase::CreateHandle( bool bCreateLocked )
-{
- AUTO_LOCK_DM();
- int memoryIndex = m_memoryLists.Head(m_freeList);
- unsigned short list = ( bCreateLocked ) ? m_lockList : m_lruList;
- if ( memoryIndex != m_memoryLists.InvalidIndex() )
- {
- m_memoryLists.Unlink( m_freeList, memoryIndex );
- m_memoryLists.LinkToTail( list, memoryIndex );
- }
- else
- {
- memoryIndex = m_memoryLists.AddToTail( list );
- }
-
- if ( bCreateLocked )
- {
- m_memoryLists[memoryIndex].lockCount++;
- }
-
- return memoryIndex;
-}
-
-memhandle_t CDataManagerBase::StoreResourceInHandle( unsigned short memoryIndex, void *pStore, unsigned int realSize )
-{
- AUTO_LOCK_DM();
- resource_lru_element_t &mem = m_memoryLists[memoryIndex];
- mem.pStore = pStore;
- m_memUsed += realSize;
- return ToHandle(memoryIndex);
-}
-
-void CDataManagerBase::TouchByIndex( unsigned short memoryIndex )
-{
- if ( memoryIndex != m_memoryLists.InvalidIndex() )
- {
- if ( m_memoryLists[memoryIndex].lockCount == 0 )
- {
- m_memoryLists.Unlink( m_lruList, memoryIndex );
- m_memoryLists.LinkToTail( m_lruList, memoryIndex );
- }
- }
-}
-
-memhandle_t CDataManagerBase::ToHandle( unsigned short index )
-{
- unsigned int hiword = m_memoryLists.Element(index).serial;
- hiword <<= 16;
- index++;
- return (memhandle_t)( hiword|index );
-}
-
-unsigned int CDataManagerBase::TargetSize()
-{
- return MemTotal_Inline();
-}
-
-unsigned int CDataManagerBase::AvailableSize()
-{
- return MemAvailable_Inline();
-}
-
-
-unsigned int CDataManagerBase::UsedSize()
-{
- return MemUsed_Inline();
-}
-
-// free resources until there is enough space to hold "size"
-unsigned int CDataManagerBase::EnsureCapacity( unsigned int size )
-{
- unsigned nBytesInitial = MemUsed_Inline();
- while ( MemUsed_Inline() > MemTotal_Inline() || MemAvailable_Inline() < size )
- {
- Lock();
- int lruIndex = m_memoryLists.Head( m_lruList );
- if ( lruIndex == m_memoryLists.InvalidIndex() )
- {
- Unlock();
- break;
- }
- m_memoryLists.Unlink( m_lruList, lruIndex );
- void *p = GetForFreeByIndex( lruIndex );
- Unlock();
- DestroyResourceStorage( p );
- }
- return ( nBytesInitial - MemUsed_Inline() );
-}
-
-// free this resource and move the handle to the free list
-void *CDataManagerBase::GetForFreeByIndex( unsigned short memoryIndex )
-{
- void *p = NULL;
- if ( memoryIndex != m_memoryLists.InvalidIndex() )
- {
- Assert( m_memoryLists[memoryIndex].lockCount == 0 );
-
- resource_lru_element_t &mem = m_memoryLists[memoryIndex];
- unsigned size = GetRealSize( mem.pStore );
- if ( size > m_memUsed )
- {
- ExecuteOnce( Warning( "Data manager 'used' memory incorrect\n" ) );
- size = m_memUsed;
- }
- m_memUsed -= size;
- p = mem.pStore;
- mem.pStore = NULL;
- mem.serial++;
- m_memoryLists.LinkToTail( m_freeList, memoryIndex );
- }
- return p;
-}
-
-// get a list of everything in the LRU
-void CDataManagerBase::GetLRUHandleList( CUtlVector< memhandle_t >& list )
-{
- for ( int node = m_memoryLists.Tail(m_lruList);
- node != m_memoryLists.InvalidIndex();
- node = m_memoryLists.Previous(node) )
- {
- list.AddToTail( ToHandle( node ) );
- }
-}
-
-// get a list of everything locked
-void CDataManagerBase::GetLockHandleList( CUtlVector< memhandle_t >& list )
-{
- for ( int node = m_memoryLists.Head(m_lockList);
- node != m_memoryLists.InvalidIndex();
- node = m_memoryLists.Next(node) )
- {
- list.AddToTail( ToHandle( node ) );
- }
-}
-
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+
+#include "basetypes.h"
+#include "datamanager.h"
+
+DECLARE_POINTER_HANDLE( memhandle_t );
+
+#define AUTO_LOCK_DM() AUTO_LOCK_( CDataManagerBase, *this )
+
+CDataManagerBase::CDataManagerBase( unsigned int maxSize )
+{
+ m_targetMemorySize = maxSize;
+ m_memUsed = 0;
+ m_lruList = m_memoryLists.CreateList();
+ m_lockList = m_memoryLists.CreateList();
+ m_freeList = m_memoryLists.CreateList();
+ m_listsAreFreed = 0;
+}
+
+CDataManagerBase::~CDataManagerBase()
+{
+ Assert( m_listsAreFreed );
+}
+
+void CDataManagerBase::NotifySizeChanged( memhandle_t handle, unsigned int oldSize, unsigned int newSize )
+{
+ Lock();
+ m_memUsed += (int)newSize - (int)oldSize;
+ Unlock();
+}
+
+void CDataManagerBase::SetTargetSize( unsigned int targetSize )
+{
+ m_targetMemorySize = targetSize;
+}
+
+unsigned int CDataManagerBase::FlushAllUnlocked()
+{
+ Lock();
+
+ int nFlush = m_memoryLists.Count( m_lruList );
+ void **pScratch = (void **)_alloca( nFlush * sizeof(void *) );
+ CUtlVector<void *> destroyList( pScratch, nFlush );
+
+ unsigned nBytesInitial = MemUsed_Inline();
+
+ int node = m_memoryLists.Head(m_lruList);
+ while ( node != m_memoryLists.InvalidIndex() )
+ {
+ int next = m_memoryLists.Next(node);
+ m_memoryLists.Unlink( m_lruList, node );
+ destroyList.AddToTail( GetForFreeByIndex( node ) );
+ node = next;
+ }
+
+ Unlock();
+
+ for ( int i = 0; i < nFlush; i++ )
+ {
+ DestroyResourceStorage( destroyList[i] );
+ }
+
+ return ( nBytesInitial - MemUsed_Inline() );
+}
+
+unsigned int CDataManagerBase::FlushToTargetSize()
+{
+ return EnsureCapacity(0);
+}
+
+// Frees everything! The LRU AND the LOCKED items. This is only used to forcibly free the resources,
+// not to make space.
+
+unsigned int CDataManagerBase::FlushAll()
+{
+ Lock();
+
+ int nFlush = m_memoryLists.Count( m_lruList ) + m_memoryLists.Count( m_lockList );
+ void **pScratch = (void **)_alloca( nFlush * sizeof(void *) );
+ CUtlVector<void *> destroyList( pScratch, nFlush );
+
+ unsigned result = MemUsed_Inline();
+ int node;
+ int nextNode;
+
+ node = m_memoryLists.Head(m_lruList);
+ while ( node != m_memoryLists.InvalidIndex() )
+ {
+ nextNode = m_memoryLists.Next(node);
+ m_memoryLists.Unlink( m_lruList, node );
+ destroyList.AddToTail( GetForFreeByIndex( node ) );
+ node = nextNode;
+ }
+
+ node = m_memoryLists.Head(m_lockList);
+ while ( node != m_memoryLists.InvalidIndex() )
+ {
+ nextNode = m_memoryLists.Next(node);
+ m_memoryLists.Unlink( m_lockList, node );
+ m_memoryLists[node].lockCount = 0;
+ destroyList.AddToTail( GetForFreeByIndex( node ) );
+ node = nextNode;
+ }
+
+ m_listsAreFreed = false;
+ Unlock();
+
+ for ( int i = 0; i < nFlush; i++ )
+ {
+ DestroyResourceStorage( destroyList[i] );
+ }
+
+ return result;
+}
+
+unsigned int CDataManagerBase::Purge( unsigned int nBytesToPurge )
+{
+ unsigned int nTargetSize = MemUsed_Inline() - nBytesToPurge;
+ // Check for underflow
+ if ( MemUsed_Inline() < nBytesToPurge )
+ nTargetSize = 0;
+ unsigned int nImpliedCapacity = MemTotal_Inline() - nTargetSize;
+ return EnsureCapacity( nImpliedCapacity );
+}
+
+
+void CDataManagerBase::DestroyResource( memhandle_t handle )
+{
+ Lock();
+ unsigned short index = FromHandle( handle );
+ if ( !m_memoryLists.IsValidIndex(index) )
+ {
+ Unlock();
+ return;
+ }
+
+ Assert( m_memoryLists[index].lockCount == 0 );
+ if ( m_memoryLists[index].lockCount )
+ BreakLock( handle );
+ m_memoryLists.Unlink( m_lruList, index );
+ void *p = GetForFreeByIndex( index );
+ Unlock();
+
+ DestroyResourceStorage( p );
+}
+
+
+void *CDataManagerBase::LockResource( memhandle_t handle )
+{
+ AUTO_LOCK_DM();
+ unsigned short memoryIndex = FromHandle(handle);
+ if ( memoryIndex != m_memoryLists.InvalidIndex() )
+ {
+ if ( m_memoryLists[memoryIndex].lockCount == 0 )
+ {
+ m_memoryLists.Unlink( m_lruList, memoryIndex );
+ m_memoryLists.LinkToTail( m_lockList, memoryIndex );
+ }
+ Assert(m_memoryLists[memoryIndex].lockCount != (unsigned short)-1);
+ m_memoryLists[memoryIndex].lockCount++;
+ return m_memoryLists[memoryIndex].pStore;
+ }
+
+ return NULL;
+}
+
+int CDataManagerBase::UnlockResource( memhandle_t handle )
+{
+ AUTO_LOCK_DM();
+ unsigned short memoryIndex = FromHandle(handle);
+ if ( memoryIndex != m_memoryLists.InvalidIndex() )
+ {
+ Assert( m_memoryLists[memoryIndex].lockCount > 0 );
+ if ( m_memoryLists[memoryIndex].lockCount > 0 )
+ {
+ m_memoryLists[memoryIndex].lockCount--;
+ if ( m_memoryLists[memoryIndex].lockCount == 0 )
+ {
+ m_memoryLists.Unlink( m_lockList, memoryIndex );
+ m_memoryLists.LinkToTail( m_lruList, memoryIndex );
+ }
+ }
+ return m_memoryLists[memoryIndex].lockCount;
+ }
+
+ return 0;
+}
+
+void *CDataManagerBase::GetResource_NoLockNoLRUTouch( memhandle_t handle )
+{
+ AUTO_LOCK_DM();
+ unsigned short memoryIndex = FromHandle(handle);
+ if ( memoryIndex != m_memoryLists.InvalidIndex() )
+ {
+ return m_memoryLists[memoryIndex].pStore;
+ }
+ return NULL;
+}
+
+
+void *CDataManagerBase::GetResource_NoLock( memhandle_t handle )
+{
+ AUTO_LOCK_DM();
+ unsigned short memoryIndex = FromHandle(handle);
+ if ( memoryIndex != m_memoryLists.InvalidIndex() )
+ {
+ TouchByIndex( memoryIndex );
+ return m_memoryLists[memoryIndex].pStore;
+ }
+ return NULL;
+}
+
+void CDataManagerBase::TouchResource( memhandle_t handle )
+{
+ AUTO_LOCK_DM();
+ TouchByIndex( FromHandle(handle) );
+}
+
+void CDataManagerBase::MarkAsStale( memhandle_t handle )
+{
+ AUTO_LOCK_DM();
+ unsigned short memoryIndex = FromHandle(handle);
+ if ( memoryIndex != m_memoryLists.InvalidIndex() )
+ {
+ if ( m_memoryLists[memoryIndex].lockCount == 0 )
+ {
+ m_memoryLists.Unlink( m_lruList, memoryIndex );
+ m_memoryLists.LinkToHead( m_lruList, memoryIndex );
+ }
+ }
+}
+
+int CDataManagerBase::BreakLock( memhandle_t handle )
+{
+ AUTO_LOCK_DM();
+ unsigned short memoryIndex = FromHandle(handle);
+ if ( memoryIndex != m_memoryLists.InvalidIndex() && m_memoryLists[memoryIndex].lockCount )
+ {
+ int nBroken = m_memoryLists[memoryIndex].lockCount;
+ m_memoryLists[memoryIndex].lockCount = 0;
+ m_memoryLists.Unlink( m_lockList, memoryIndex );
+ m_memoryLists.LinkToTail( m_lruList, memoryIndex );
+
+ return nBroken;
+ }
+ return 0;
+}
+
+int CDataManagerBase::BreakAllLocks()
+{
+ AUTO_LOCK_DM();
+ int nBroken = 0;
+ int node;
+ int nextNode;
+
+ node = m_memoryLists.Head(m_lockList);
+ while ( node != m_memoryLists.InvalidIndex() )
+ {
+ nBroken++;
+ nextNode = m_memoryLists.Next(node);
+ m_memoryLists[node].lockCount = 0;
+ m_memoryLists.Unlink( m_lockList, node );
+ m_memoryLists.LinkToTail( m_lruList, node );
+ node = nextNode;
+ }
+
+ return nBroken;
+
+}
+
+unsigned short CDataManagerBase::CreateHandle( bool bCreateLocked )
+{
+ AUTO_LOCK_DM();
+ int memoryIndex = m_memoryLists.Head(m_freeList);
+ unsigned short list = ( bCreateLocked ) ? m_lockList : m_lruList;
+ if ( memoryIndex != m_memoryLists.InvalidIndex() )
+ {
+ m_memoryLists.Unlink( m_freeList, memoryIndex );
+ m_memoryLists.LinkToTail( list, memoryIndex );
+ }
+ else
+ {
+ memoryIndex = m_memoryLists.AddToTail( list );
+ }
+
+ if ( bCreateLocked )
+ {
+ m_memoryLists[memoryIndex].lockCount++;
+ }
+
+ return memoryIndex;
+}
+
+memhandle_t CDataManagerBase::StoreResourceInHandle( unsigned short memoryIndex, void *pStore, unsigned int realSize )
+{
+ AUTO_LOCK_DM();
+ resource_lru_element_t &mem = m_memoryLists[memoryIndex];
+ mem.pStore = pStore;
+ m_memUsed += realSize;
+ return ToHandle(memoryIndex);
+}
+
+void CDataManagerBase::TouchByIndex( unsigned short memoryIndex )
+{
+ if ( memoryIndex != m_memoryLists.InvalidIndex() )
+ {
+ if ( m_memoryLists[memoryIndex].lockCount == 0 )
+ {
+ m_memoryLists.Unlink( m_lruList, memoryIndex );
+ m_memoryLists.LinkToTail( m_lruList, memoryIndex );
+ }
+ }
+}
+
+memhandle_t CDataManagerBase::ToHandle( unsigned short index )
+{
+ unsigned int hiword = m_memoryLists.Element(index).serial;
+ hiword <<= 16;
+ index++;
+ return (memhandle_t)( hiword|index );
+}
+
+unsigned int CDataManagerBase::TargetSize()
+{
+ return MemTotal_Inline();
+}
+
+unsigned int CDataManagerBase::AvailableSize()
+{
+ return MemAvailable_Inline();
+}
+
+
+unsigned int CDataManagerBase::UsedSize()
+{
+ return MemUsed_Inline();
+}
+
+// free resources until there is enough space to hold "size"
+unsigned int CDataManagerBase::EnsureCapacity( unsigned int size )
+{
+ unsigned nBytesInitial = MemUsed_Inline();
+ while ( MemUsed_Inline() > MemTotal_Inline() || MemAvailable_Inline() < size )
+ {
+ Lock();
+ int lruIndex = m_memoryLists.Head( m_lruList );
+ if ( lruIndex == m_memoryLists.InvalidIndex() )
+ {
+ Unlock();
+ break;
+ }
+ m_memoryLists.Unlink( m_lruList, lruIndex );
+ void *p = GetForFreeByIndex( lruIndex );
+ Unlock();
+ DestroyResourceStorage( p );
+ }
+ return ( nBytesInitial - MemUsed_Inline() );
+}
+
+// free this resource and move the handle to the free list
+void *CDataManagerBase::GetForFreeByIndex( unsigned short memoryIndex )
+{
+ void *p = NULL;
+ if ( memoryIndex != m_memoryLists.InvalidIndex() )
+ {
+ Assert( m_memoryLists[memoryIndex].lockCount == 0 );
+
+ resource_lru_element_t &mem = m_memoryLists[memoryIndex];
+ unsigned size = GetRealSize( mem.pStore );
+ if ( size > m_memUsed )
+ {
+ ExecuteOnce( Warning( "Data manager 'used' memory incorrect\n" ) );
+ size = m_memUsed;
+ }
+ m_memUsed -= size;
+ p = mem.pStore;
+ mem.pStore = NULL;
+ mem.serial++;
+ m_memoryLists.LinkToTail( m_freeList, memoryIndex );
+ }
+ return p;
+}
+
+// get a list of everything in the LRU
+void CDataManagerBase::GetLRUHandleList( CUtlVector< memhandle_t >& list )
+{
+ for ( int node = m_memoryLists.Tail(m_lruList);
+ node != m_memoryLists.InvalidIndex();
+ node = m_memoryLists.Previous(node) )
+ {
+ list.AddToTail( ToHandle( node ) );
+ }
+}
+
+// get a list of everything locked
+void CDataManagerBase::GetLockHandleList( CUtlVector< memhandle_t >& list )
+{
+ for ( int node = m_memoryLists.Head(m_lockList);
+ node != m_memoryLists.InvalidIndex();
+ node = m_memoryLists.Next(node) )
+ {
+ list.AddToTail( ToHandle( node ) );
+ }
+}
+