diff options
| author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-01-16 00:08:52 +0100 |
|---|---|---|
| committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-01-16 00:08:52 +0100 |
| commit | 52cd2cbd7eb62648ae13f600c125116e8cdfc89d (patch) | |
| tree | decb09f8360ccfcb17c5d436a33b0dd7af4d274e /src/server/game | |
| parent | 58564cc496d675372d4a9062b463bdbc338f50cc (diff) | |
Core/Maps: Unload transports in MapManager::UnloadAll instead of singleton destructor.
Core/Transports: Properly delink units from transports on transport desutruction. - Thanks to Shauren for help.
Core/ObjectAccessor: Unload corpse 'storage' in added UnloadAll method called in WorldRunnable postservice hook.
Core/Master: Change some postservice queries to syncrhonous (direct) execution to ensure execution on shutdown
Core/Master: Remove redundant calls to ACE::init and ACE::fini
These changes were made to fix crash/freeze issues on shutdown.
Diffstat (limited to 'src/server/game')
| -rwxr-xr-x | src/server/game/Entities/Transport/Transport.cpp | 7 | ||||
| -rwxr-xr-x | src/server/game/Globals/ObjectAccessor.cpp | 14 | ||||
| -rwxr-xr-x | src/server/game/Globals/ObjectAccessor.h | 5 | ||||
| -rwxr-xr-x | src/server/game/Maps/MapManager.cpp | 26 |
4 files changed, 30 insertions, 22 deletions
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 2687f1ea233..7381f059940 100755 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -180,8 +180,11 @@ Transport::Transport(uint32 period, uint32 script) : GameObject(), m_period(peri Transport::~Transport() { - for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end();) - (*(itr++))->ForcedDespawn(); + for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end(); ++itr) + { + (*itr)->SetTransport(NULL); + GetMap()->AddObjectToRemoveList(*itr); + } m_NPCPassengerSet.clear(); diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index af04b6c7f65..2405d6c2b40 100755 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -45,11 +45,6 @@ ObjectAccessor::ObjectAccessor() ObjectAccessor::~ObjectAccessor() { - for (Player2CorpsesMapType::const_iterator itr = i_player2corpse.begin(); itr != i_player2corpse.end(); ++itr) - { - itr->second->RemoveFromWorld(); - delete itr->second; - } } WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, uint64 guid) @@ -385,6 +380,15 @@ void ObjectAccessor::Update(uint32 /*diff*/) } } +void ObjectAccessor::UnloadAll() +{ + for (Player2CorpsesMapType::const_iterator itr = i_player2corpse.begin(); itr != i_player2corpse.end(); ++itr) + { + itr->second->RemoveFromWorld(); + delete itr->second; + } +} + /// Define the static members of HashMapHolder template <class T> UNORDERED_MAP< uint64, T* > HashMapHolder<T>::m_objectMap; diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index b8087a84f1e..c8be042ef8d 100755 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -40,6 +40,7 @@ class DynamicObject; class WorldObject; class Vehicle; class Map; +class WorldRunnable; template <class T> class HashMapHolder @@ -84,6 +85,7 @@ class HashMapHolder class ObjectAccessor { friend class ACE_Singleton<ObjectAccessor, ACE_Thread_Mutex>; + friend class WorldRunnable; ObjectAccessor(); ~ObjectAccessor(); ObjectAccessor(const ObjectAccessor&); @@ -254,6 +256,9 @@ class ObjectAccessor typedef ACE_Thread_Mutex LockType; + protected: + void UnloadAll(); + private: Player2CorpsesMapType i_player2corpse; diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index d829c8e30d3..7b6d0a64460 100755 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -45,16 +45,6 @@ MapManager::MapManager() MapManager::~MapManager() { - for (MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - delete iter->second; - - for (TransportSet::iterator i = m_Transports.begin(); i != m_Transports.end(); ++i) - { - (*i)->RemoveFromWorld(); - delete *i; - } - - Map::DeleteStateMachine(); } void MapManager::Initialize() @@ -305,17 +295,23 @@ bool MapManager::IsValidMAP(uint32 mapid) void MapManager::UnloadAll() { - for (MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - iter->second->UnloadAll(); + for (TransportSet::iterator i = m_Transports.begin(); i != m_Transports.end(); ++i) + { + (*i)->RemoveFromWorld(); + delete *i; + } - while (!i_maps.empty()) + for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();) { - delete i_maps.begin()->second; - i_maps.erase(i_maps.begin()); + iter->second->UnloadAll(); + delete iter->second; + i_maps.erase(iter++); } if (m_updater.activated()) m_updater.deactivate(); + + Map::DeleteStateMachine(); } void MapManager::InitMaxInstanceId() |
