diff options
author | megamage <none@none> | 2009-06-18 19:27:17 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-06-18 19:27:17 -0500 |
commit | a49c2982ba975a4c5dba7b1bf6a31a7c54a13c1d (patch) | |
tree | e7acd28b0fa53076221d335a9b033695f0abed2b | |
parent | fd73be2f1e2aa134f3b26277281411de691db04a (diff) | |
parent | 19225e8880b12bf3b72743ea253a94b52635a212 (diff) |
*Merge.
*mtmap is disabled by default. To use it, define MULTI_THREAD_MAP in define.h
*mtmap support is not provided for windows users. Because there is no free openmp lib for windows. If you have openmp lib and want to use openmp, you need to manually change the setting.
--HG--
branch : trunk
-rw-r--r-- | src/framework/Platform/Define.h | 3 | ||||
-rw-r--r-- | src/game/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/game/MapManager.cpp | 41 | ||||
-rw-r--r-- | src/game/World.cpp | 3 | ||||
-rw-r--r-- | src/game/World.h | 1 | ||||
-rw-r--r-- | src/shared/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/shared/Util.cpp | 56 | ||||
-rw-r--r-- | src/trinitycore/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/trinitycore/trinitycore.conf.dist | 5 | ||||
-rw-r--r-- | src/trinityrealm/CMakeLists.txt | 1 |
10 files changed, 110 insertions, 5 deletions
diff --git a/src/framework/Platform/Define.h b/src/framework/Platform/Define.h index 57c5b1b59cd..8f10fc20020 100644 --- a/src/framework/Platform/Define.h +++ b/src/framework/Platform/Define.h @@ -137,7 +137,10 @@ typedef uint32 DWORD; typedef uint64 OBJECT_HANDLE; +//#define MULTI_THREAD_MAP +#ifdef MULTI_THREAD_MAP #define MAP_BASED_RAND_GEN +#endif #define MaNGOS Trinity #define MANGOS_DLL_DECL TRINITY_DLL_DECL diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 339594bc4f9..bb05b4d6076 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -294,6 +294,6 @@ SET(game_STAT_SRCS Wintergrasp.cpp ZoneScript.h ) - +add_definitions(-fopenmp) add_library(game STATIC ${game_STAT_SRCS}) ADD_DEPENDENCIES(game revision.h) diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp index ece2876cab4..0da0d003144 100644 --- a/src/game/MapManager.cpp +++ b/src/game/MapManager.cpp @@ -18,6 +18,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifdef MULTI_THREAD_MAP +#include <omp.h> +#endif #include "MapManager.h" #include "InstanceSaveMgr.h" #include "Policies/SingletonImp.h" @@ -251,12 +254,33 @@ MapManager::Update(uint32 diff) if( !i_timer.Passed() ) return; - for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) +#ifdef MULTI_THREAD_MAP + uint32 i=0; + MapMapType::iterator iter; + std::vector<Map*> update_queue(i_maps.size()); + omp_set_num_threads(sWorld.getConfig(CONFIG_NUMTHREADS)); + for(iter = i_maps.begin(), i=0;iter != i_maps.end(); ++iter, i++) + update_queue[i]=iter->second; +/* + gomp in gcc <4.4 version cannot parallelise loops using random access iterators + so until gcc 4.4 isnt standard, we need the update_queue workaround +*/ +#pragma omp parallel for schedule(dynamic) private(i) shared(update_queue) + for(int32 i = 0; i < i_maps.size(); ++i) { checkAndCorrectGridStatesArray(); // debugging code, should be deleted some day + update_queue[i]->Update(i_timer.GetCurrent()); + sWorld.RecordTimeDiff("UpdateMap %u", update_queue[i]->GetId()); + // sLog.outError("This is thread %d out of %d threads,updating map %u",omp_get_thread_num(),omp_get_num_threads(),iter->second->GetId()); + + } +#else + for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) + { iter->second->Update(i_timer.GetCurrent()); sWorld.RecordTimeDiff("UpdateMap %u", iter->second->GetId()); } +#endif ObjectAccessor::Instance().Update(i_timer.GetCurrent()); sWorld.RecordTimeDiff("UpdateObjectAccessor"); @@ -269,8 +293,19 @@ MapManager::Update(uint32 diff) void MapManager::DoDelayedMovesAndRemoves() { - for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - iter->second->RelocationNotify(); + /* + int i =0; + std::vector<Map*> update_queue(i_maps.size()); + MapMapType::iterator iter; + for(iter = i_maps.begin();iter != i_maps.end(); ++iter, i++) + update_queue[i] = iter->second; + + omp_set_num_threads(sWorld.getConfig(CONFIG_NUMTHREADS)); + +#pragma omp parallel for schedule(dynamic) private(i) shared(update_queue) + for(i=0;i<i_maps.size();i++) + update_queue[i]->DoDelayedMovesAndRemoves(); + */ } bool MapManager::ExistMapAndVMap(uint32 mapid, float x,float y) diff --git a/src/game/World.cpp b/src/game/World.cpp index 150b2285191..3b72d0d2d02 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -1088,6 +1088,7 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_INTERVAL_LOG_UPDATE] = sConfig.GetIntDefault("RecordUpdateTimeDiffInterval", 60000); m_configs[CONFIG_MIN_LOG_UPDATE] = sConfig.GetIntDefault("MinRecordUpdateTimeDiff", 10); m_configs[CONFIG_CHECK_DB] = sConfig.GetBoolDefault("CheckDB", true); + m_configs[CONFIG_NUMTHREADS] = sConfig.GetIntDefault("MapUpdate.Threads",1); std::string forbiddenmaps = sConfig.GetStringDefault("ForbiddenMaps", ""); char * forbiddenMaps = new char[forbiddenmaps.length() + 1]; @@ -1784,9 +1785,11 @@ void World::Update(uint32 diff) sBattleGroundMgr.Update(diff); RecordTimeDiff("UpdateBattleGroundMgr"); + sOutdoorPvPMgr.Update(diff); RecordTimeDiff("UpdateOutdoorPvPMgr"); + // execute callbacks from sql queries that were queued recently UpdateResultQueue(); RecordTimeDiff("UpdateResultQueue"); diff --git a/src/game/World.h b/src/game/World.h index c91ee2e70ec..d8bb7477568 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -235,6 +235,7 @@ enum WorldConfigs CONFIG_CHECK_DB, CONFIG_ENABLE_SINFO_LOGIN, CONFIG_PET_LOS, + CONFIG_NUMTHREADS, CONFIG_OFFHAND_CHECK_AT_TALENTS_RESET, CONFIG_CHATLOG_CHANNEL, CONFIG_CHATLOG_WHISPER, diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index b271e2b9545..de73967546b 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -21,7 +21,7 @@ SET(shared_STAT_SRCS WorldPacket.h SystemConfig.h ) - +add_definitions(-fopenmp) add_library(shared STATIC ${shared_STAT_SRCS}) target_link_libraries( shared diff --git a/src/shared/Util.cpp b/src/shared/Util.cpp index ac57fc3c9e9..354568c778f 100644 --- a/src/shared/Util.cpp +++ b/src/shared/Util.cpp @@ -28,6 +28,60 @@ typedef ACE_TSS<MTRand> MTRandTSS; static MTRandTSS mtRand; +#ifdef MULTI_THREAD_MAP + +int32 irand (int32 min, int32 max) +{ + int32 result; +#pragma omp critical (mtrand) +{ + result = int32 (mtRand->randInt (max - min)) + min; +} + return result; +} + +uint32 urand (uint32 min, uint32 max) +{ + uint32 result; +#pragma omp critical (mtrand) +{ + result = mtRand->randInt (max - min) + min; +} + return result; +} + +int32 rand32 () +{ + int32 result; +#pragma omp critical (mtrand) +{ + result = mtRand->randInt (); +} + return result; +} + +double rand_norm(void) +{ + double result; +#pragma omp critical (mtrand) +{ + result = mtRand->randExc (); +} + return result; +} + +double rand_chance (void) +{ + double result; +#pragma omp critical (mtrand) +{ + result = mtRand->randExc (100.0); +} + return result; +} + +#else + int32 irand (int32 min, int32 max) { return int32 (mtRand->randInt (max - min)) + min; @@ -53,6 +107,8 @@ double rand_chance (void) return mtRand->randExc (100.0); } +#endif + Tokens StrSplit(const std::string &src, const std::string &sep) { Tokens r; diff --git a/src/trinitycore/CMakeLists.txt b/src/trinitycore/CMakeLists.txt index f6b2b3a75b0..268b38f55a5 100644 --- a/src/trinitycore/CMakeLists.txt +++ b/src/trinitycore/CMakeLists.txt @@ -45,6 +45,7 @@ vmaps ZThread g3dlite readline +gomp ${SCRIPT_LIB} ${MYSQL_LIBRARIES} ${POSTGRE_LIBS} diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist index bc6d907fbe0..4cb5ec233c1 100644 --- a/src/trinitycore/trinitycore.conf.dist +++ b/src/trinitycore/trinitycore.conf.dist @@ -188,6 +188,10 @@ EAIErrorLevel = 2 # Default: 1 (permit addon channel) # 0 (do not permit addon channel) # +# MapUpdate.Threads +# Number of threads to update maps. +# Default: 1 +# ################################################################################################################### UseProcessors = 0 @@ -214,6 +218,7 @@ LogDB.Opt.ClearInterval = 10 LogDB.Opt.ClearTime = 1209600 MaxCoreStuckTime = 0 AddonChannel = 1 +MapUpdate.Threads = 1 ################################################################################################################### # SERVER LOGGING diff --git a/src/trinityrealm/CMakeLists.txt b/src/trinityrealm/CMakeLists.txt index a8f5a646924..62f943a1c96 100644 --- a/src/trinityrealm/CMakeLists.txt +++ b/src/trinityrealm/CMakeLists.txt @@ -38,6 +38,7 @@ trinityauth trinityconfig ZThread zlib +gomp ${SSLLIB} ${MYSQL_LIBRARIES} ${OSX_LIBS} |