From 67b5d06fa7fcb65f70fec48450769083705445d1 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Thu, 27 Jan 2005 01:58:20 +0000 Subject: [PATCH] add RageFileManager::GetFileDriver, RageFileManager::ReleaseFileDriver --- stepmania/src/RageFileManager.cpp | 41 +++++++++++++++++++++++++++++++ stepmania/src/RageFileManager.h | 5 ++++ 2 files changed, 46 insertions(+) diff --git a/stepmania/src/RageFileManager.cpp b/stepmania/src/RageFileManager.cpp index 398d4d2524..4589a51aab 100644 --- a/stepmania/src/RageFileManager.cpp +++ b/stepmania/src/RageFileManager.cpp @@ -62,6 +62,47 @@ void UnreferenceAllDrivers( vector &aDriverList ) aDriverList.clear(); } +RageFileDriver *RageFileManager::GetFileDriver( CString sMountpoint ) +{ + FixSlashesInPlace( sMountpoint ); + if( sMountpoint.size() && sMountpoint.Right(1) != "/" ) + sMountpoint += '/'; + + g_Mutex->Lock(); + RageFileDriver *pRet = NULL; + for( unsigned i = 0; i < g_Drivers.size(); ++i ) + { + if( g_Drivers[i].MountPoint.CompareNoCase( sMountpoint ) ) + continue; + + pRet = g_Drivers[i].driver; + ++g_Drivers[i].m_iRefs; + break; + } + g_Mutex->Unlock(); + + return pRet; +} + +void RageFileManager::ReleaseFileDriver( RageFileDriver *pDriver ) +{ + ASSERT( pDriver != NULL ); + + g_Mutex->Lock(); + unsigned i; + for( i = 0; i < g_Drivers.size(); ++i ) + { + if( g_Drivers[i].driver == pDriver ) + break; + } + ASSERT( i != g_Drivers.size() ); + + --g_Drivers[i].m_iRefs; + + g_Mutex->Broadcast(); + g_Mutex->Unlock(); +} + /* Wait for the given driver to become unreferenced, and remove it from the list * to get exclusive access to it. Returns false if the driver is no longer available * (somebody else got it first). */ diff --git a/stepmania/src/RageFileManager.h b/stepmania/src/RageFileManager.h index a6387587a5..fb4212573b 100644 --- a/stepmania/src/RageFileManager.h +++ b/stepmania/src/RageFileManager.h @@ -9,6 +9,7 @@ extern CString InitialWorkingDirectory; extern CString DirOfExecutable; +class RageFileDriver; class RageFileManager { @@ -48,6 +49,10 @@ public: void Close( RageFileBasic *obj ); RageFileBasic *CopyFileObj( const RageFileBasic *cpy ); + /* Retrieve or release a reference to the low-level driver for a mountpoint. */ + RageFileDriver *GetFileDriver( CString sMountpoint ); + void ReleaseFileDriver( RageFileDriver *pDriver ); + private: RageFileBasic *OpenForWriting( CString sPath, int mode, int &err ); };