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.
This commit is contained in:
megamage
2011-11-07 09:44:09 -05:00
parent f42998277f
commit 495ef10b0d
2 changed files with 15 additions and 22 deletions
+14 -22
View File
@@ -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 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<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
+1
View File
@@ -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;
}