add RageFileManager::GetFileDriver, RageFileManager::ReleaseFileDriver

This commit is contained in:
Glenn Maynard
2005-01-27 01:58:20 +00:00
parent 1739ffdd81
commit 67b5d06fa7
2 changed files with 46 additions and 0 deletions
+41
View File
@@ -62,6 +62,47 @@ void UnreferenceAllDrivers( vector<LoadedDriver> &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). */
+5
View File
@@ -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 );
};