aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorMachiavelli <machiavelli.trinity@gmail.com>2011-01-16 00:08:52 +0100
committerMachiavelli <machiavelli.trinity@gmail.com>2011-01-16 00:08:52 +0100
commit52cd2cbd7eb62648ae13f600c125116e8cdfc89d (patch)
treedecb09f8360ccfcb17c5d436a33b0dd7af4d274e /src/server/game
parent58564cc496d675372d4a9062b463bdbc338f50cc (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-xsrc/server/game/Entities/Transport/Transport.cpp7
-rwxr-xr-xsrc/server/game/Globals/ObjectAccessor.cpp14
-rwxr-xr-xsrc/server/game/Globals/ObjectAccessor.h5
-rwxr-xr-xsrc/server/game/Maps/MapManager.cpp26
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()