diff options
author | Machiavelli <none@none> | 2010-08-13 01:16:50 +0200 |
---|---|---|
committer | Machiavelli <none@none> | 2010-08-13 01:16:50 +0200 |
commit | b98874fce04ec736e869012735bbbad310a3b00c (patch) | |
tree | 7d43800c61e63cb0491cc24143084fdba6f50ec4 /src | |
parent | 91eed572afbbabd7efe04ec3a164123ff2429a2a (diff) |
Make access to ObjectMgr´s creature and gobject respawntime storage threadsafe.
(TODO: Maybe this should be stored on map level instead)
Fixes issue #3006
Fixes issue #3071
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 2 |
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; |