don't unload edit steps while they're in use

This commit is contained in:
Glenn Maynard
2007-05-31 18:24:22 +00:00
parent 69e23dc79a
commit f2671274da
6 changed files with 35 additions and 8 deletions
+3 -3
View File
@@ -359,8 +359,6 @@ void GameState::JoinPlayer( PlayerNumber pn )
void GameState::UnjoinPlayer( PlayerNumber pn )
{
PROFILEMAN->UnloadProfile( pn );
m_bSideIsJoined[pn] = false;
m_iPlayerStageTokens[pn] = 0;
@@ -369,8 +367,10 @@ void GameState::UnjoinPlayer( PlayerNumber pn )
if( m_MasterPlayerNumber == pn )
m_MasterPlayerNumber = GetFirstHumanPlayer();
/* Unjoin STATSMAN first, so steps used by this player are released
* and can be released by PROFILEMAN. */
STATSMAN->UnjoinPlayer( pn );
PROFILEMAN->UnloadProfile( pn );
Message msg( MessageIDToString(Message_PlayerUnjoined) );
msg.SetParam( "Player", pn );
+8 -3
View File
@@ -1263,7 +1263,9 @@ bool Song::Matches(RString sGroup, RString sSong) const
return false;
}
void Song::FreeAllLoadedFromProfile( ProfileSlot slot )
/* If apInUse is set, it contains a list of steps which are in use elsewhere, and
* should not be deleted. */
void Song::FreeAllLoadedFromProfile( ProfileSlot slot, const set<Steps*> *setInUse )
{
/* DeleteSteps will remove and recreate autogen notes, which may reorder
* m_vpSteps, so be careful not to skip over entries. */
@@ -1273,8 +1275,11 @@ void Song::FreeAllLoadedFromProfile( ProfileSlot slot )
Steps* pSteps = m_vpSteps[s];
if( !pSteps->WasLoadedFromProfile() )
continue;
if( slot == ProfileSlot_Invalid || pSteps->GetLoadedFromProfileSlot() == slot )
apToRemove.push_back( pSteps );
if( slot != ProfileSlot_Invalid && pSteps->GetLoadedFromProfileSlot() != slot )
continue;
if( setInUse != NULL && setInUse->find(pSteps) != setInUse->end() )
continue;
apToRemove.push_back( pSteps );
}
for( unsigned i = 0; i < apToRemove.size(); ++i )
+4 -1
View File
@@ -1585,8 +1585,11 @@ void SongManager::FreeAllLoadedFromProfile( ProfileSlot slot )
RefreshCourseGroupInfo();
/* Free profile steps. */
set<Steps*> setInUse;
if( STATSMAN )
STATSMAN->GetStepsInUse( setInUse );
FOREACH( Song*, m_pSongs, s )
(*s)->FreeAllLoadedFromProfile( slot );
(*s)->FreeAllLoadedFromProfile( slot, &setInUse );
// After freeing some Steps pointers, the cache will be invalid.
StepsID::ClearCache();
+17
View File
@@ -229,7 +229,24 @@ void StatsManager::UnjoinPlayer( PlayerNumber pn )
m_vPlayedStageStats.erase( m_vPlayedStageStats.begin()+i );
--i;
}
}
void StatsManager::GetStepsInUse( set<Steps*> &apInUseOut ) const
{
for( int i = 0; i < (int) m_vPlayedStageStats.size(); ++i )
{
FOREACH_PlayerNumber( pn )
{
const PlayerStageStats &pss = m_vPlayedStageStats[i].m_player[pn];
apInUseOut.insert( pss.m_vpPossibleSteps.begin(), pss.m_vpPossibleSteps.end() );
}
FOREACH_MultiPlayer( mp )
{
const PlayerStageStats &pss = m_vPlayedStageStats[i].m_multiPlayer[mp];
apInUseOut.insert( pss.m_vpPossibleSteps.begin(), pss.m_vpPossibleSteps.end() );
}
}
}
// lua start
+1
View File
@@ -27,6 +27,7 @@ public:
static void CommitStatsToProfiles( const StageStats *pSS );
void UnjoinPlayer( PlayerNumber pn );
void GetStepsInUse( set<Steps*> &apInUseOut ) const;
// Lua
void PushSelf( lua_State *L );
+2 -1
View File
@@ -8,6 +8,7 @@
#include "EnumHelper.h"
#include "RageUtil_AutoPtr.h"
#include "RageTypes.h"
#include <set>
class Steps;
class Style;
@@ -212,7 +213,7 @@ public:
void AddSteps( Steps* pSteps ); // we are responsible for deleting the memory pointed to by pSteps!
void DeleteSteps( const Steps* pSteps, bool bReAutoGen = true );
void FreeAllLoadedFromProfile( ProfileSlot slot = ProfileSlot_Invalid );
void FreeAllLoadedFromProfile( ProfileSlot slot = ProfileSlot_Invalid, const set<Steps*> *setInUse = NULL );
bool WasLoadedFromProfile() const { return m_LoadedFromProfile != ProfileSlot_Invalid; }
void GetStepsLoadedFromProfile( ProfileSlot slot, vector<Steps*> &vpStepsOut ) const;
int GetNumStepsLoadedFromProfile( ProfileSlot slot ) const;