mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 17:05:44 +01:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user