aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none.none>2011-11-02 09:39:37 -0400
committermegamage <none@none.none>2011-11-02 09:39:37 -0400
commit809694408aaee6a2020326dc4e17b3b52c49c840 (patch)
tree47af6fea41f0b37a6696214957cb845a98ac3239 /src
parent9229b878f2705790676806411a18500ab07178cc (diff)
Change ObjectAccessor::i_corpseLock to ACE_RW_Thread_Mutex.
Remove unecessary guard in ObjectAccessor::Update.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Globals/ObjectAccessor.cpp23
-rwxr-xr-xsrc/server/game/Globals/ObjectAccessor.h17
2 files changed, 17 insertions, 23 deletions
diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp
index a61bbc605ce..28dcd64e3b7 100755
--- a/src/server/game/Globals/ObjectAccessor.cpp
+++ b/src/server/game/Globals/ObjectAccessor.cpp
@@ -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
diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h
index 277e54826a8..12e50c455ab 100755
--- a/src/server/game/Globals/ObjectAccessor.h
+++ b/src/server/game/Globals/ObjectAccessor.h
@@ -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()