aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp43
-rw-r--r--src/server/game/Globals/ObjectMgr.h2
2 files changed, 31 insertions, 14 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index abbd731c877..6c434219a1e 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -7229,7 +7229,12 @@ void ObjectMgr::LoadNPCSpellClickSpells()
void ObjectMgr::SaveCreatureRespawnTime(uint32 loguid, uint32 instance, time_t t)
{
- mCreatureRespawnTimes[MAKE_PAIR64(loguid,instance)] = t;
+ // This function can be Called from various map threads concurrently
+ {
+ ACE_GUARD(ACE_Thread_Mutex, guard, m_CreatureRespawnTimesMtx);
+ mCreatureRespawnTimes[MAKE_PAIR64(loguid,instance)] = t;
+ }
+
WorldDatabase.PExecute("DELETE FROM creature_respawn WHERE guid = '%u' AND instance = '%u'", loguid, instance);
if (t)
WorldDatabase.PExecute("INSERT INTO creature_respawn VALUES ('%u', '" UI64FMTD "', '%u')", loguid, uint64(t), instance);
@@ -7247,7 +7252,12 @@ void ObjectMgr::DeleteCreatureData(uint32 guid)
void ObjectMgr::SaveGORespawnTime(uint32 loguid, uint32 instance, time_t t)
{
- mGORespawnTimes[MAKE_PAIR64(loguid,instance)] = t;
+ // This function can be called from different map threads concurrently
+ {
+ ACE_GUARD(ACE_Thread_Mutex, guard, m_CreatureRespawnTimesMtx);
+ mGORespawnTimes[MAKE_PAIR64(loguid,instance)] = t;
+ }
+
WorldDatabase.PExecute("DELETE FROM gameobject_respawn WHERE guid = '%u' AND instance = '%u'", loguid, instance);
if (t)
WorldDatabase.PExecute("INSERT INTO gameobject_respawn VALUES ('%u', '" UI64FMTD "', '%u')", loguid, uint64(t), instance);
@@ -7255,26 +7265,31 @@ void ObjectMgr::SaveGORespawnTime(uint32 loguid, uint32 instance, time_t t)
void ObjectMgr::DeleteRespawnTimeForInstance(uint32 instance)
{
+ // This function can be called from different map threads concurrently
RespawnTimes::iterator next;
- for (RespawnTimes::iterator itr = mGORespawnTimes.begin(); itr != mGORespawnTimes.end(); itr = next)
{
- next = itr;
- ++next;
+ ACE_GUARD(ACE_Thread_Mutex, guard, m_GORespawnTimesMtx);
+ for (RespawnTimes::iterator itr = mGORespawnTimes.begin(); itr != mGORespawnTimes.end(); itr = next)
+ {
+ next = itr;
+ ++next;
- if (GUID_HIPART(itr->first) == instance)
- mGORespawnTimes.erase(itr);
+ if (GUID_HIPART(itr->first) == instance)
+ mGORespawnTimes.erase(itr);
+ }
}
-
- for (RespawnTimes::iterator itr = mCreatureRespawnTimes.begin(); itr != mCreatureRespawnTimes.end(); itr = next)
{
- next = itr;
- ++next;
+ ACE_GUARD(ACE_Thread_Mutex, guard, m_CreatureRespawnTimesMtx);
+ for (RespawnTimes::iterator itr = mCreatureRespawnTimes.begin(); itr != mCreatureRespawnTimes.end(); itr = next)
+ {
+ next = itr;
+ ++next;
- if (GUID_HIPART(itr->first) == instance)
- mCreatureRespawnTimes.erase(itr);
+ if (GUID_HIPART(itr->first) == instance)
+ mCreatureRespawnTimes.erase(itr);
+ }
}
-
WorldDatabase.PExecute("DELETE FROM creature_respawn WHERE instance = '%u'", instance);
WorldDatabase.PExecute("DELETE FROM gameobject_respawn WHERE instance = '%u'", instance);
}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 9abe783b5b3..b5d4bc352c9 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1084,7 +1084,9 @@ class ObjectMgr
GossipMenuItemsLocaleMap mGossipMenuItemsLocaleMap;
PointOfInterestLocaleMap mPointOfInterestLocaleMap;
RespawnTimes mCreatureRespawnTimes;
+ ACE_Thread_Mutex m_CreatureRespawnTimesMtx;
RespawnTimes mGORespawnTimes;
+ ACE_Thread_Mutex m_GORespawnTimesMtx;
CacheNpcTextIdMap m_mCacheNpcTextIdMap;
CacheVendorItemMap m_mCacheVendorItemMap;