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:
@@ -84,8 +84,7 @@ class HashMapHolder
|
|||||||
|
|
||||||
class ObjectAccessor
|
class ObjectAccessor
|
||||||
{
|
{
|
||||||
friend class ACE_Singleton<ObjectAccessor, ACE_Thread_Mutex>;
|
friend class ACE_Singleton<ObjectAccessor, ACE_Null_Mutex>;
|
||||||
friend class WorldRunnable;
|
|
||||||
private:
|
private:
|
||||||
ObjectAccessor();
|
ObjectAccessor();
|
||||||
~ObjectAccessor();
|
~ObjectAccessor();
|
||||||
@@ -93,9 +92,6 @@ class ObjectAccessor
|
|||||||
ObjectAccessor& operator=(const ObjectAccessor&);
|
ObjectAccessor& operator=(const ObjectAccessor&);
|
||||||
|
|
||||||
public:
|
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
|
// TODO: override these template functions for each holder type and add assertions
|
||||||
|
|
||||||
template<class T> static T* GetObjectInOrOutOfWorld(uint64 guid, T* /*typeSpecifier*/)
|
template<class T> static T* GetObjectInOrOutOfWorld(uint64 guid, T* /*typeSpecifier*/)
|
||||||
@@ -196,10 +192,10 @@ class ObjectAccessor
|
|||||||
static Pet* FindPet(uint64);
|
static Pet* FindPet(uint64);
|
||||||
static Player* FindPlayer(uint64);
|
static Player* FindPlayer(uint64);
|
||||||
static Unit* FindUnit(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
|
// 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();
|
return HashMapHolder<Player>::GetContainer();
|
||||||
}
|
}
|
||||||
@@ -216,24 +212,19 @@ class ObjectAccessor
|
|||||||
// return HashMapHolder<GameObject>::GetContainer();
|
// return HashMapHolder<GameObject>::GetContainer();
|
||||||
//}
|
//}
|
||||||
|
|
||||||
template<class T> void AddObject(T* object)
|
template<class T> static void AddObject(T* object)
|
||||||
{
|
{
|
||||||
HashMapHolder<T>::Insert(object);
|
HashMapHolder<T>::Insert(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T> void RemoveObject(T* object)
|
template<class T> static void RemoveObject(T* object)
|
||||||
{
|
{
|
||||||
HashMapHolder<T>::Remove(object);
|
HashMapHolder<T>::Remove(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoveObject(Player* pl)
|
static void SaveAllPlayers();
|
||||||
{
|
|
||||||
HashMapHolder<Player>::Remove(pl);
|
|
||||||
RemoveUpdateObject((Object*)pl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SaveAllPlayers();
|
|
||||||
|
|
||||||
|
//non-static functions
|
||||||
void AddUpdateObject(Object* obj)
|
void AddUpdateObject(Object* obj)
|
||||||
{
|
{
|
||||||
TRINITY_GUARD(ACE_Thread_Mutex, i_objectLock);
|
TRINITY_GUARD(ACE_Thread_Mutex, i_objectLock);
|
||||||
@@ -246,18 +237,16 @@ class ObjectAccessor
|
|||||||
i_objects.erase(obj);
|
i_objects.erase(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Update(uint32 diff);
|
|
||||||
|
|
||||||
//Thread safe
|
//Thread safe
|
||||||
Corpse* GetCorpseForPlayerGUID(uint64 guid);
|
Corpse* GetCorpseForPlayerGUID(uint64 guid);
|
||||||
void RemoveCorpse(Corpse* corpse);
|
void RemoveCorpse(Corpse* corpse);
|
||||||
void AddCorpse(Corpse* corpse);
|
void AddCorpse(Corpse* corpse);
|
||||||
void AddCorpsesToGrid(GridCoord const& gridpair, GridType& grid, Map* map);
|
void AddCorpsesToGrid(GridCoord const& gridpair, GridType& grid, Map* map);
|
||||||
Corpse* ConvertCorpseForPlayer(uint64 player_guid, bool insignia = false);
|
Corpse* ConvertCorpseForPlayer(uint64 player_guid, bool insignia = false);
|
||||||
//Thread unsafe
|
|
||||||
void RemoveOldCorpses();
|
|
||||||
|
|
||||||
protected:
|
//Thread unsafe
|
||||||
|
void Update(uint32 diff);
|
||||||
|
void RemoveOldCorpses();
|
||||||
void UnloadAll();
|
void UnloadAll();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -265,6 +254,9 @@ class ObjectAccessor
|
|||||||
static void _buildPacket(Player*, Object*, UpdateDataMapType&);
|
static void _buildPacket(Player*, Object*, UpdateDataMapType&);
|
||||||
void _update();
|
void _update();
|
||||||
|
|
||||||
|
typedef UNORDERED_MAP<uint64, Corpse*> Player2CorpsesMapType;
|
||||||
|
typedef UNORDERED_MAP<Player*, UpdateData>::value_type UpdateDataValueType;
|
||||||
|
|
||||||
std::set<Object*> i_objects;
|
std::set<Object*> i_objects;
|
||||||
Player2CorpsesMapType i_player2corpse;
|
Player2CorpsesMapType i_player2corpse;
|
||||||
|
|
||||||
@@ -272,5 +264,5 @@ class ObjectAccessor
|
|||||||
ACE_RW_Thread_Mutex i_corpseLock;
|
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
|
#endif
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ template<>
|
|||||||
void Map::DeleteFromWorld(Player* pl)
|
void Map::DeleteFromWorld(Player* pl)
|
||||||
{
|
{
|
||||||
sObjectAccessor->RemoveObject(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;
|
delete pl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user