From d7ede406009777fc644c4ef3bf426054e0388363 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 10 Apr 2004 21:45:14 +0000 Subject: [PATCH] fix unmount memleak make sure we normalize mountpoints the same way when unmounting as mounting add checkpoints --- stepmania/src/RageFileManager.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/stepmania/src/RageFileManager.cpp b/stepmania/src/RageFileManager.cpp index f740562cd4..679fca8393 100644 --- a/stepmania/src/RageFileManager.cpp +++ b/stepmania/src/RageFileManager.cpp @@ -114,6 +114,7 @@ static void ChangeToDirOfExecutable( CString argv0 ) RageFileManager::RageFileManager( CString argv0 ) { + CHECKPOINT_M( argv0 ); ChangeToDirOfExecutable( argv0 ); g_Mutex = new RageMutex("RageFileManager"); @@ -171,8 +172,10 @@ void RageFileManager::MountInitialFilesystems() RageFileManager::Mount( "dir", Root, "" ); #elif defined(_WINDOWS) /* All Windows data goes in the directory one level above the executable. */ + CHECKPOINT_M( ssprintf( "DOE \"%s\"", DirOfExecutable.c_str()) ); CStringArray parts; split( DirOfExecutable, "/", parts ); + CHECKPOINT_M( ssprintf( "... %i parts", parts.size()) ); RAGE_ASSERT_M( parts.size() > 1, ssprintf("Strange DirOfExecutable: %s", DirOfExecutable.c_str()) ); CString Dir = join( "/", parts.begin(), parts.end()-1 ); RageFileManager::Mount( "dir", Dir, "" ); @@ -276,21 +279,29 @@ void RageFileManager::Mount( CString Type, CString Root, CString MountPoint ) { LockMut( *g_Mutex ); - // Unmount anything that was previously mounted here. - Unmount( Type, Root, MountPoint ); - if( MountPoint.size() && MountPoint.Right(1) != "/" ) MountPoint += '/'; ASSERT( Root != "" ); + CHECKPOINT_M( ssprintf("\"%s\", \"%s\", \"%s\"", + Type.c_str(), Root.c_str(), MountPoint.c_str() ) ); + + // Unmount anything that was previously mounted here. + Unmount( Type, Root, MountPoint ); + + CHECKPOINT; RageFileDriver *driver = MakeFileDriver( Type, Root ); if( !driver ) { + CHECKPOINT; + if( LOG ) LOG->Warn("Can't mount unknown VFS type \"%s\", root \"%s\"", Type.c_str(), Root.c_str() ); return; } + CHECKPOINT; + LoadedDriver ld; ld.driver = driver; ld.Type = Type; @@ -298,13 +309,18 @@ void RageFileManager::Mount( CString Type, CString Root, CString MountPoint ) ld.MountPoint = MountPoint; g_Drivers.push_back( ld ); + CHECKPOINT; g_Mountpoints->LoadFromDrivers( g_Drivers ); + CHECKPOINT; } void RageFileManager::Unmount( CString Type, CString Root, CString MountPoint ) { LockMut( *g_Mutex ); + if( MountPoint.size() && MountPoint.Right(1) != "/" ) + MountPoint += '/'; + for( unsigned i = 0; i < g_Drivers.size(); ++i ) { if( g_Drivers[i].Type.CompareNoCase( Type ) ) @@ -313,6 +329,8 @@ void RageFileManager::Unmount( CString Type, CString Root, CString MountPoint ) continue; if( g_Drivers[i].MountPoint.CompareNoCase( MountPoint ) ) continue; + + delete g_Drivers[i].driver; g_Drivers.erase( g_Drivers.begin()+i ); }