From c9c5c2a355a718486b173255a9312da896ed279d Mon Sep 17 00:00:00 2001 From: megamage Date: Fri, 21 Oct 2011 17:29:09 -0400 Subject: Use read/write thread mx guard instead of general guard for HashMapHolder. --- src/server/game/Chat/Commands/Level3.cpp | 2 +- src/server/game/Globals/ObjectAccessor.cpp | 14 +++++----- src/server/game/Globals/ObjectAccessor.h | 30 +++++++++++----------- .../game/Server/Protocol/Handlers/MiscHandler.cpp | 4 +-- src/server/scripts/Commands/cs_gm.cpp | 4 +-- 5 files changed, 27 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp index 8dd5e17f550..d87717d96fe 100755 --- a/src/server/game/Chat/Commands/Level3.cpp +++ b/src/server/game/Chat/Commands/Level3.cpp @@ -2671,7 +2671,7 @@ bool ChatHandler::HandleResetAllCommand(const char * args) CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE (at_login & '%u') = '0'", atLogin, atLogin); - ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, *HashMapHolder::GetLock(), true); + ACE_READ_GUARD_RETURN(HashMapHolder::LockType, guard, *HashMapHolder::GetLock(), true); HashMapHolder::MapType const& plist = sObjectAccessor->GetPlayers(); for (HashMapHolder::MapType::const_iterator itr = plist.begin(); itr != plist.end(); ++itr) itr->second->SetAtLoginFlag(atLogin); diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index 306d19d2001..84d27efc8d9 100755 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -165,9 +165,9 @@ Unit* ObjectAccessor::FindUnit(uint64 guid) Player* ObjectAccessor::FindPlayerByName(const char* name) { - ACE_GUARD_RETURN(LockType, g, *HashMapHolder::GetLock(), NULL); - HashMapHolder::MapType& m = HashMapHolder::GetContainer(); - for (HashMapHolder::MapType::iterator iter = m.begin(); iter != m.end(); ++iter) + ACE_READ_GUARD_RETURN(HashMapHolder::LockType, g, *HashMapHolder::GetLock(), NULL); + HashMapHolder::MapType const& m = GetPlayers(); + for (HashMapHolder::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter) if (iter->second->IsInWorld() && strcmp(name, iter->second->GetName()) == 0) return iter->second; @@ -176,9 +176,9 @@ Player* ObjectAccessor::FindPlayerByName(const char* name) void ObjectAccessor::SaveAllPlayers() { - ACE_GUARD(LockType, g, *HashMapHolder::GetLock()); - HashMapHolder::MapType& m = HashMapHolder::GetContainer(); - for (HashMapHolder::MapType::iterator itr = m.begin(); itr != m.end(); ++itr) + ACE_READ_GUARD(HashMapHolder::LockType, g, *HashMapHolder::GetLock()); + HashMapHolder::MapType const& m = GetPlayers(); + for (HashMapHolder::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr) itr->second->SaveToDB(); } @@ -380,7 +380,7 @@ void ObjectAccessor::UnloadAll() /// Define the static members of HashMapHolder template UNORDERED_MAP< uint64, T* > HashMapHolder::m_objectMap; -template ACE_Thread_Mutex HashMapHolder::i_lock; +template typename HashMapHolder::LockType HashMapHolder::i_lock; /// Global definitions for the hashmap storage diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 4ffe27b19d8..ae88ae3673f 100755 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -48,23 +48,23 @@ class HashMapHolder public: typedef UNORDERED_MAP MapType; - typedef ACE_Thread_Mutex LockType; + typedef ACE_RW_Thread_Mutex LockType; static void Insert(T* o) { - ACE_GUARD(LockType, Guard, i_lock); + ACE_WRITE_GUARD(LockType, Guard, i_lock); m_objectMap[o->GetGUID()] = o; } static void Remove(T* o) { - ACE_GUARD(LockType, Guard, i_lock); + ACE_WRITE_GUARD(LockType, Guard, i_lock); m_objectMap.erase(o->GetGUID()); } static T* Find(uint64 guid) { - ACE_GUARD_RETURN(LockType, Guard, i_lock, NULL); + ACE_READ_GUARD_RETURN(LockType, Guard, i_lock, NULL); typename MapType::iterator itr = m_objectMap.find(guid); return (itr != m_objectMap.end()) ? itr->second : NULL; } @@ -198,22 +198,22 @@ class ObjectAccessor Player* FindPlayerByName(const char* name); // when using this, you must use the hashmapholder's lock - HashMapHolder::MapType& GetPlayers() + HashMapHolder::MapType const& GetPlayers() const { return HashMapHolder::GetContainer(); } // when using this, you must use the hashmapholder's lock - HashMapHolder::MapType& GetCreatures() - { - return HashMapHolder::GetContainer(); - } - - // when using this, you must use the hashmapholder's lock - HashMapHolder::MapType& GetGameObjects() - { - return HashMapHolder::GetContainer(); - } + //HashMapHolder::MapType& GetCreatures() + //{ + // return HashMapHolder::GetContainer(); + //} + + //// when using this, you must use the hashmapholder's lock + //HashMapHolder::MapType& GetGameObjects() + //{ + // return HashMapHolder::GetContainer(); + //} template void AddObject(T* object) { diff --git a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp index 1b0cef69c04..971e0b89c0f 100755 --- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp @@ -239,8 +239,8 @@ void WorldSession::HandleWhoOpcode(WorldPacket & recv_data) data << uint32(matchcount); // placeholder, count of players matching criteria data << uint32(displaycount); // placeholder, count of players displayed - ACE_GUARD(ACE_Thread_Mutex, g, *HashMapHolder::GetLock()); - HashMapHolder::MapType& m = sObjectAccessor->GetPlayers(); + ACE_READ_GUARD(HashMapHolder::LockType, g, *HashMapHolder::GetLock()); + HashMapHolder::MapType const& m = sObjectAccessor->GetPlayers(); for (HashMapHolder::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr) { if (AccountMgr::IsPlayerAccount(security)) diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index 2a352e92d01..68ccf96bb87 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -117,8 +117,8 @@ public: bool first = true; bool footer = false; - ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, *HashMapHolder::GetLock(), true); - HashMapHolder::MapType& m = sObjectAccessor->GetPlayers(); + ACE_READ_GUARD_RETURN(HashMapHolder::LockType, guard, *HashMapHolder::GetLock(), true); + HashMapHolder::MapType const& m = sObjectAccessor->GetPlayers(); for (HashMapHolder::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr) { AccountTypes itrSec = itr->second->GetSession()->GetSecurity(); -- cgit v1.2.3