From 495ef10b0db14e21d1dc2a62bcb0f6c12b1332b3 Mon Sep 17 00:00:00 2001 From: megamage Date: Mon, 7 Nov 2011 09:44:09 -0500 Subject: [PATCH] Change ObjectAccessor to an ACE_Null_Mutex singleton, since its members have been protected by individual locks. Also make some of its member functions static. --- src/server/game/Globals/ObjectAccessor.h | 36 +++++++++--------------- src/server/game/Maps/Map.cpp | 1 + 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 12e50c455a..25fa20dce7 100755 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -84,8 +84,7 @@ class HashMapHolder class ObjectAccessor { - friend class ACE_Singleton; - friend class WorldRunnable; + friend class ACE_Singleton; private: ObjectAccessor(); ~ObjectAccessor(); @@ -93,9 +92,6 @@ class ObjectAccessor ObjectAccessor& operator=(const ObjectAccessor&); public: - typedef UNORDERED_MAP Player2CorpsesMapType; - typedef UNORDERED_MAP::value_type UpdateDataValueType; - // TODO: override these template functions for each holder type and add assertions template static T* GetObjectInOrOutOfWorld(uint64 guid, T* /*typeSpecifier*/) @@ -196,10 +192,10 @@ class ObjectAccessor static Pet* FindPet(uint64); static Player* FindPlayer(uint64); static Unit* FindUnit(uint64); - Player* FindPlayerByName(const char* name); + static Player* FindPlayerByName(const char* name); // when using this, you must use the hashmapholder's lock - HashMapHolder::MapType const& GetPlayers() const + static HashMapHolder::MapType const& GetPlayers() { return HashMapHolder::GetContainer(); } @@ -216,24 +212,19 @@ class ObjectAccessor // return HashMapHolder::GetContainer(); //} - template void AddObject(T* object) + template static void AddObject(T* object) { HashMapHolder::Insert(object); } - template void RemoveObject(T* object) + template static void RemoveObject(T* object) { HashMapHolder::Remove(object); } - void RemoveObject(Player* pl) - { - HashMapHolder::Remove(pl); - RemoveUpdateObject((Object*)pl); - } - - void SaveAllPlayers(); + static void SaveAllPlayers(); + //non-static functions void AddUpdateObject(Object* obj) { TRINITY_GUARD(ACE_Thread_Mutex, i_objectLock); @@ -246,18 +237,16 @@ class ObjectAccessor 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(); - protected: + //Thread unsafe + void Update(uint32 diff); + void RemoveOldCorpses(); void UnloadAll(); private: @@ -265,6 +254,9 @@ class ObjectAccessor static void _buildPacket(Player*, Object*, UpdateDataMapType&); void _update(); + typedef UNORDERED_MAP Player2CorpsesMapType; + typedef UNORDERED_MAP::value_type UpdateDataValueType; + std::set i_objects; Player2CorpsesMapType i_player2corpse; @@ -272,5 +264,5 @@ class ObjectAccessor ACE_RW_Thread_Mutex i_corpseLock; }; -#define sObjectAccessor ACE_Singleton::instance() +#define sObjectAccessor ACE_Singleton::instance() #endif diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index ebeac025f1..c6fafe5446 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -312,6 +312,7 @@ template<> void Map::DeleteFromWorld(Player* pl) { sObjectAccessor->RemoveObject(pl); + sObjectAccessor->RemoveUpdateObject(pl); //TODO: I do not know why we need this, it should be removed in ~Object anyway delete pl; }