add RageFileManager::GetFileDriver, RageFileManager::ReleaseFileDriver
This commit is contained in:
@@ -62,6 +62,47 @@ void UnreferenceAllDrivers( vector<LoadedDriver> &aDriverList )
|
|||||||
aDriverList.clear();
|
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
|
/* 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
|
* to get exclusive access to it. Returns false if the driver is no longer available
|
||||||
* (somebody else got it first). */
|
* (somebody else got it first). */
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
extern CString InitialWorkingDirectory;
|
extern CString InitialWorkingDirectory;
|
||||||
extern CString DirOfExecutable;
|
extern CString DirOfExecutable;
|
||||||
|
class RageFileDriver;
|
||||||
|
|
||||||
class RageFileManager
|
class RageFileManager
|
||||||
{
|
{
|
||||||
@@ -48,6 +49,10 @@ public:
|
|||||||
void Close( RageFileBasic *obj );
|
void Close( RageFileBasic *obj );
|
||||||
RageFileBasic *CopyFileObj( const RageFileBasic *cpy );
|
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:
|
private:
|
||||||
RageFileBasic *OpenForWriting( CString sPath, int mode, int &err );
|
RageFileBasic *OpenForWriting( CString sPath, int mode, int &err );
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user