From 6bacf2239fe423979f54d1df3281b697b21c7b14 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Tue, 10 Feb 2009 05:58:38 +0300 Subject: [PATCH] [7257] Fixed unexpected errors in log and non-freed memory at battleground system shutdown. --- src/game/BattleGround.cpp | 6 ++++++ src/game/BattleGroundMgr.cpp | 21 +++++++++++++++------ src/game/BattleGroundMgr.h | 1 + src/mangosd/WorldRunnable.cpp | 4 ++++ src/shared/revision_nr.h | 2 +- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp index d99524cf0..69c9f19c8 100644 --- a/src/game/BattleGround.cpp +++ b/src/game/BattleGround.cpp @@ -1322,6 +1322,9 @@ void BattleGround::SpawnBGCreature(uint32 type, uint32 respawntime) */ bool BattleGround::DelCreature(uint32 type) { + if(!m_BgCreatures[type]) + return true; + Creature *cr = HashMapHolder::Find(m_BgCreatures[type]); if(!cr) { @@ -1336,6 +1339,9 @@ bool BattleGround::DelCreature(uint32 type) bool BattleGround::DelObject(uint32 type) { + if(!m_BgObjects[type]) + return true; + GameObject *obj = HashMapHolder::Find(m_BgObjects[type]); if(!obj) { diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index 4b31cd0c5..b37969943 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -1090,16 +1090,25 @@ BattleGroundMgr::BattleGroundMgr() : m_AutoDistributionTimeChecker(0), m_ArenaTe BattleGroundMgr::~BattleGroundMgr() { - BattleGroundSet::iterator itr, next; - for(itr = m_BattleGrounds.begin(); itr != m_BattleGrounds.end(); itr = next) + DeleteAlllBattleGrounds(); +} + +void BattleGroundMgr::DeleteAlllBattleGrounds() +{ + for(BattleGroundSet::iterator itr = m_BattleGrounds.begin(); itr != m_BattleGrounds.end();) { - next = itr; - ++next; BattleGround * bg = itr->second; - m_BattleGrounds.erase(itr); + m_BattleGrounds.erase(itr++); delete bg; } - m_BattleGrounds.clear(); + + // destroy template battlegrounds that listed only in queues (other already terminated) + for(uint32 bgTypeId = 0; bgTypeId < MAX_BATTLEGROUND_TYPE_ID; ++bgTypeId) + { + // ~BattleGround call unregistring BG from queue + while(!BGFreeSlotQueue[bgTypeId].empty()) + delete BGFreeSlotQueue[bgTypeId].front(); + } } // used to update running battlegrounds, and delete finished ones diff --git a/src/game/BattleGroundMgr.h b/src/game/BattleGroundMgr.h index 2cf268689..289cffbaa 100644 --- a/src/game/BattleGroundMgr.h +++ b/src/game/BattleGroundMgr.h @@ -207,6 +207,7 @@ class BattleGroundMgr void RemoveBattleGround(uint32 instanceID) { m_BattleGrounds.erase(instanceID); } void CreateInitialBattleGrounds(); + void DeleteAlllBattleGrounds(); void SendToBattleGround(Player *pl, uint32 InstanceID); diff --git a/src/mangosd/WorldRunnable.cpp b/src/mangosd/WorldRunnable.cpp index 2e97f97c2..f2c427c4e 100644 --- a/src/mangosd/WorldRunnable.cpp +++ b/src/mangosd/WorldRunnable.cpp @@ -27,6 +27,7 @@ #include "Timer.h" #include "ObjectAccessor.h" #include "MapManager.h" +#include "BattleGroundMgr.h" #include "Database/DatabaseEnv.h" @@ -75,6 +76,9 @@ void WorldRunnable::run() sWorld.KickAll(); // save and kick all players sWorld.UpdateSessions( 1 ); // real players unload required UpdateSessions call + // unload battleground templates before different singletons destroyed + sBattleGroundMgr.DeleteAlllBattleGrounds(); + sWorldSocketMgr->StopNetwork(); MapManager::Instance().UnloadAll(); // unload all grids (including locked in memory) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 62411a004..4ffcae7a6 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7256" + #define REVISION_NR "7257" #endif // __REVISION_NR_H__