aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.cpp4
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.h30
2 files changed, 30 insertions, 4 deletions
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index a422fd8531c..6370eda6568 100644
--- a/src/server/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
@@ -156,14 +156,14 @@ void InstanceSaveManager::RemoveInstanceSave(uint32 InstanceId)
CharacterDatabase.Execute(stmt);
}
- delete itr->second;
+ itr->second->SetToDelete(true);
m_instanceSaveById.erase(itr);
}
}
InstanceSave::InstanceSave(uint16 MapId, uint32 InstanceId, Difficulty difficulty, time_t resetTime, bool canReset)
: m_resetTime(resetTime), m_instanceid(InstanceId), m_mapid(MapId),
- m_difficulty(difficulty), m_canReset(canReset)
+ m_difficulty(difficulty), m_canReset(canReset), m_toDelete(false)
{
}
diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h
index c5dcaf32463..ef55005d0d6 100644
--- a/src/server/game/Instances/InstanceSaveMgr.h
+++ b/src/server/game/Instances/InstanceSaveMgr.h
@@ -81,10 +81,29 @@ class InstanceSave
/* online players bound to the instance (perm/solo)
does not include the members of the group unless they have permanent saves */
void AddPlayer(Player* player) { TRINITY_GUARD(ACE_Thread_Mutex, _lock); m_playerList.push_back(player); }
- bool RemovePlayer(Player* player) { TRINITY_GUARD(ACE_Thread_Mutex, _lock); m_playerList.remove(player); return UnloadIfEmpty(); }
+ bool RemovePlayer(Player* player)
+ {
+ _lock.acquire();
+ m_playerList.remove(player);
+ bool isStillValid = UnloadIfEmpty();
+ _lock.release();
+
+ //delete here if needed, after releasing the lock
+ if(m_toDelete)
+ delete this;
+
+ return isStillValid;
+ }
/* all groups bound to the instance */
void AddGroup(Group* group) { m_groupList.push_back(group); }
- bool RemoveGroup(Group* group) { m_groupList.remove(group); return UnloadIfEmpty(); }
+ bool RemoveGroup(Group* group)
+ {
+ m_groupList.remove(group);
+ bool isStillValid = UnloadIfEmpty();
+ if(m_toDelete)
+ delete this;
+ return isStillValid;
+ }
/* instances cannot be reset (except at the global reset time)
if there are players permanently bound to it
@@ -96,6 +115,12 @@ class InstanceSave
but that would depend on a lot of things that can easily change in future */
Difficulty GetDifficulty() const { return m_difficulty; }
+ /* used to flag the InstanceSave as to be deleted, so the caller can delete it */
+ void SetToDelete(bool toDelete)
+ {
+ m_toDelete = toDelete;
+ }
+
typedef std::list<Player*> PlayerListType;
typedef std::list<Group*> GroupListType;
private:
@@ -110,6 +135,7 @@ class InstanceSave
uint32 m_mapid;
Difficulty m_difficulty;
bool m_canReset;
+ bool m_toDelete;
ACE_Thread_Mutex _lock;
};