diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Globals/ObjectAccessor.cpp | 23 | ||||
-rwxr-xr-x | src/server/game/Globals/ObjectAccessor.h | 17 |
2 files changed, 17 insertions, 23 deletions
diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index a61bbc605ce..28dcd64e3b7 100755 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -184,7 +184,7 @@ void ObjectAccessor::SaveAllPlayers() Corpse* ObjectAccessor::GetCorpseForPlayerGUID(uint64 guid) { - ACE_GUARD_RETURN(LockType, guard, i_corpseGuard, NULL); + TRINITY_READ_GUARD(ACE_RW_Thread_Mutex, i_corpseLock); Player2CorpsesMapType::iterator iter = i_player2corpse.find(guid); if (iter == i_player2corpse.end()) @@ -209,7 +209,7 @@ void ObjectAccessor::RemoveCorpse(Corpse* corpse) // Critical section { - ACE_GUARD(LockType, g, i_corpseGuard); + TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, i_corpseLock); Player2CorpsesMapType::iterator iter = i_player2corpse.find(corpse->GetOwnerGUID()); if (iter == i_player2corpse.end()) // TODO: Fix this @@ -231,7 +231,7 @@ void ObjectAccessor::AddCorpse(Corpse* corpse) // Critical section { - ACE_GUARD(LockType, g, i_corpseGuard); + TRINITY_WRITE_GUARD(ACE_RW_Thread_Mutex, i_corpseLock); ASSERT(i_player2corpse.find(corpse->GetOwnerGUID()) == i_player2corpse.end()); i_player2corpse[corpse->GetOwnerGUID()] = corpse; @@ -246,7 +246,7 @@ void ObjectAccessor::AddCorpse(Corpse* corpse) void ObjectAccessor::AddCorpsesToGrid(GridCoord const& gridpair, GridType& grid, Map* map) { - ACE_GUARD(LockType, g, i_corpseGuard); + TRINITY_READ_GUARD(ACE_RW_Thread_Mutex, i_corpseLock); for (Player2CorpsesMapType::iterator iter = i_player2corpse.begin(); iter != i_player2corpse.end(); ++iter) { @@ -346,17 +346,12 @@ void ObjectAccessor::Update(uint32 /*diff*/) { UpdateDataMapType update_players; - // Critical section + while (!i_objects.empty()) { - ACE_GUARD(LockType, g, i_updateGuard); - - while (!i_objects.empty()) - { - Object* obj = *i_objects.begin(); - ASSERT(obj && obj->IsInWorld()); - i_objects.erase(i_objects.begin()); - obj->BuildUpdate(update_players); - } + Object* obj = *i_objects.begin(); + ASSERT(obj && obj->IsInWorld()); + i_objects.erase(i_objects.begin()); + obj->BuildUpdate(update_players); } WorldPacket packet; // here we allocate a std::vector with a size of 0x10000 diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 277e54826a8..12e50c455ab 100755 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -102,6 +102,7 @@ class ObjectAccessor { return HashMapHolder<T>::Find(guid); } + static Unit* GetObjectInOrOutOfWorld(uint64 guid, Unit* /*typeSpecifier*/) { if (IS_PLAYER_GUID(guid)) @@ -235,42 +236,40 @@ class ObjectAccessor void AddUpdateObject(Object* obj) { - ACE_GUARD(LockType, Guard, i_updateGuard); + TRINITY_GUARD(ACE_Thread_Mutex, i_objectLock); i_objects.insert(obj); } void RemoveUpdateObject(Object* obj) { - ACE_GUARD(LockType, Guard, i_updateGuard); + TRINITY_GUARD(ACE_Thread_Mutex, i_objectLock); i_objects.erase(obj); } void Update(uint32 diff); + //Thread safe Corpse* GetCorpseForPlayerGUID(uint64 guid); void RemoveCorpse(Corpse* corpse); void AddCorpse(Corpse* corpse); void AddCorpsesToGrid(GridCoord const& gridpair, GridType& grid, Map* map); Corpse* ConvertCorpseForPlayer(uint64 player_guid, bool insignia = false); + //Thread unsafe void RemoveOldCorpses(); - typedef ACE_Thread_Mutex LockType; - protected: void UnloadAll(); private: - - Player2CorpsesMapType i_player2corpse; - static void _buildChangeObjectForPlayer(WorldObject*, UpdateDataMapType&); static void _buildPacket(Player*, Object*, UpdateDataMapType&); void _update(); std::set<Object*> i_objects; + Player2CorpsesMapType i_player2corpse; - LockType i_updateGuard; - LockType i_corpseGuard; + ACE_Thread_Mutex i_objectLock; + ACE_RW_Thread_Mutex i_corpseLock; }; #define sObjectAccessor ACE_Singleton<ObjectAccessor, ACE_Thread_Mutex>::instance() |