Core/ObjectMgr: Properly block when mutex is being held when saving creature/GO respawntime data instead of discarding the save operation.

--HG--
branch : trunk
This commit is contained in:
Machiavelli
2010-11-10 21:57:33 +01:00
parent 2263305141
commit 9153b83ab6

View File

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