From 9153b83ab6fc01e0fab9ef73dcbe8e09ba84872c Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Wed, 10 Nov 2010 21:57:33 +0100 Subject: Core/ObjectMgr: Properly block when mutex is being held when saving creature/GO respawntime data instead of discarding the save operation. --HG-- branch : trunk --- src/server/game/Globals/ObjectMgr.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index f78d6dc15f1..9e158fbfa81 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -7513,8 +7513,9 @@ void ObjectMgr::SaveCreatureRespawnTime(uint32 loguid, uint32 instance, time_t t { // This function can be Called from various map threads concurrently { - ACE_GUARD(ACE_Thread_Mutex, guard, m_CreatureRespawnTimesMtx); + m_CreatureRespawnTimesMtx.acquire(); mCreatureRespawnTimes[MAKE_PAIR64(loguid,instance)] = t; + m_CreatureRespawnTimesMtx.release(); } PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CRESPAWNTIME); @@ -7546,8 +7547,9 @@ void ObjectMgr::SaveGORespawnTime(uint32 loguid, uint32 instance, time_t t) { // This function can be called from different map threads concurrently { - ACE_GUARD(ACE_Thread_Mutex, guard, m_GORespawnTimesMtx); + m_GORespawnTimesMtx.acquire(); mGORespawnTimes[MAKE_PAIR64(loguid,instance)] = t; + m_GORespawnTimesMtx.release(); } WorldDatabase.PExecute("DELETE FROM gameobject_respawn WHERE guid = '%u' AND instance = '%u'", loguid, instance); @@ -7561,7 +7563,7 @@ void ObjectMgr::DeleteRespawnTimeForInstance(uint32 instance) RespawnTimes::iterator next; { - ACE_GUARD(ACE_Thread_Mutex, guard, m_GORespawnTimesMtx); + m_GORespawnTimesMtx.acquire(); for (RespawnTimes::iterator itr = mGORespawnTimes.begin(); itr != mGORespawnTimes.end(); itr = next) { next = itr; @@ -7570,9 +7572,10 @@ void ObjectMgr::DeleteRespawnTimeForInstance(uint32 instance) if (GUID_HIPART(itr->first) == instance) mGORespawnTimes.erase(itr); } + m_GORespawnTimesMtx.release(); } { - ACE_GUARD(ACE_Thread_Mutex, guard, m_CreatureRespawnTimesMtx); + m_CreatureRespawnTimesMtx.acquire(); for (RespawnTimes::iterator itr = mCreatureRespawnTimes.begin(); itr != mCreatureRespawnTimes.end(); itr = next) { next = itr; @@ -7581,6 +7584,7 @@ void ObjectMgr::DeleteRespawnTimeForInstance(uint32 instance) if (GUID_HIPART(itr->first) == instance) mCreatureRespawnTimes.erase(itr); } + m_CreatureRespawnTimesMtx.release(); } WorldDatabase.PExecute("DELETE FROM creature_respawn WHERE instance = '%u'", instance); WorldDatabase.PExecute("DELETE FROM gameobject_respawn WHERE instance = '%u'", instance); -- cgit v1.2.3