Change ObjectAccessor::i_corpseLock to ACE_RW_Thread_Mutex.

Remove unecessary guard in ObjectAccessor::Update.
This commit is contained in:
megamage
2011-11-02 09:39:37 -04:00
parent 9229b878f2
commit 809694408a
2 changed files with 17 additions and 23 deletions

View File

@@ -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

View File

@@ -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()