diff options
author | megamage <none@none.none> | 2011-11-07 09:44:09 -0500 |
---|---|---|
committer | megamage <none@none.none> | 2011-11-07 09:44:09 -0500 |
commit | 495ef10b0db14e21d1dc2a62bcb0f6c12b1332b3 (patch) | |
tree | a4089535f24d3aaf983d4610f2f528dbedf43720 | |
parent | f42998277f33ba4260b5283bb3161f5b4049a553 (diff) |
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.
-rwxr-xr-x | src/server/game/Globals/ObjectAccessor.h | 34 | ||||
-rwxr-xr-x | src/server/game/Maps/Map.cpp | 1 |
2 files changed, 14 insertions, 21 deletions
diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 12e50c455ab..25fa20dce70 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<ObjectAccessor, ACE_Thread_Mutex>; - friend class WorldRunnable; + friend class ACE_Singleton<ObjectAccessor, ACE_Null_Mutex>; private: ObjectAccessor(); ~ObjectAccessor(); @@ -93,9 +92,6 @@ class ObjectAccessor ObjectAccessor& operator=(const ObjectAccessor&); public: - typedef UNORDERED_MAP<uint64, Corpse*> Player2CorpsesMapType; - typedef UNORDERED_MAP<Player*, UpdateData>::value_type UpdateDataValueType; - // TODO: override these template functions for each holder type and add assertions template<class T> 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<Player>::MapType const& GetPlayers() const + static HashMapHolder<Player>::MapType const& GetPlayers() { return HashMapHolder<Player>::GetContainer(); } @@ -216,24 +212,19 @@ class ObjectAccessor // return HashMapHolder<GameObject>::GetContainer(); //} - template<class T> void AddObject(T* object) + template<class T> static void AddObject(T* object) { HashMapHolder<T>::Insert(object); } - template<class T> void RemoveObject(T* object) + template<class T> static void RemoveObject(T* object) { HashMapHolder<T>::Remove(object); } - void RemoveObject(Player* pl) - { - HashMapHolder<Player>::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 Update(uint32 diff); void RemoveOldCorpses(); - - protected: void UnloadAll(); private: @@ -265,6 +254,9 @@ class ObjectAccessor static void _buildPacket(Player*, Object*, UpdateDataMapType&); void _update(); + typedef UNORDERED_MAP<uint64, Corpse*> Player2CorpsesMapType; + typedef UNORDERED_MAP<Player*, UpdateData>::value_type UpdateDataValueType; + std::set<Object*> i_objects; Player2CorpsesMapType i_player2corpse; @@ -272,5 +264,5 @@ class ObjectAccessor ACE_RW_Thread_Mutex i_corpseLock; }; -#define sObjectAccessor ACE_Singleton<ObjectAccessor, ACE_Thread_Mutex>::instance() +#define sObjectAccessor ACE_Singleton<ObjectAccessor, ACE_Null_Mutex>::instance() #endif diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index ebeac025f1d..c6fafe5446e 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; } |