aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorraczman <none@none>2009-06-15 09:07:51 +0200
committerraczman <none@none>2009-06-15 09:07:51 +0200
commit19225e8880b12bf3b72743ea253a94b52635a212 (patch)
tree6ad5d22134939c7bed0aa1d95d68f354241a5654 /src
parent98c8b762b7de97f89ce072e6bd8ace2b832d0742 (diff)
Added basic support for multithreaded map updates using openmp standard.
Windows users need to install Platform SDK to use this feature, linux users have everything they need in gcc. Number of threads used to update world is set by confiuration file, and can be changed dynamically without restarting core. Thanks to megamage and Jeniczek for testing and helping out with this. --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/CMakeLists.txt2
-rw-r--r--src/game/MapManager.cpp35
-rw-r--r--src/game/Unit.cpp1
-rw-r--r--src/game/World.cpp3
-rw-r--r--src/game/World.h2
-rw-r--r--src/shared/CMakeLists.txt2
-rw-r--r--src/shared/Util.cpp35
-rw-r--r--src/trinitycore/CMakeLists.txt1
-rw-r--r--src/trinitycore/trinitycore.conf.dist5
-rw-r--r--src/trinityrealm/CMakeLists.txt1
10 files changed, 74 insertions, 13 deletions
diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt
index 621ce3def3e..6bd3c740af7 100644
--- a/src/game/CMakeLists.txt
+++ b/src/game/CMakeLists.txt
@@ -265,6 +265,6 @@ SET(game_STAT_SRCS
GroupReference.h
GroupRefManager.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 6a8cd130691..5a66ab6cea8 100644
--- a/src/game/MapManager.cpp
+++ b/src/game/MapManager.cpp
@@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <omp.h>
#include "MapManager.h"
#include "InstanceSaveMgr.h"
#include "Policies/SingletonImp.h"
@@ -248,12 +249,25 @@ MapManager::Update(time_t diff)
ObjectAccessor::Instance().UpdatePlayers(i_timer.GetCurrent());
sWorld.RecordTimeDiff("UpdatePlayers");
-
- for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
+ 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
- iter->second->Update(i_timer.GetCurrent());
- sWorld.RecordTimeDiff("UpdateMap %u", iter->second->GetId());
+ 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());
+
}
ObjectAccessor::Instance().Update(i_timer.GetCurrent());
@@ -267,8 +281,17 @@ MapManager::Update(time_t diff)
void MapManager::DoDelayedMovesAndRemoves()
{
- for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
- iter->second->DoDelayedMovesAndRemoves();
+ 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/Unit.cpp b/src/game/Unit.cpp
index e07b2aef98a..23cde7b2fc6 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <omp.h>
#include "Common.h"
#include "Log.h"
#include "Opcodes.h"
diff --git a/src/game/World.cpp b/src/game/World.cpp
index c0f815e8888..fb8d78fe0af 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1029,6 +1029,7 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_SHOW_KICK_IN_WORLD] = sConfig.GetBoolDefault("ShowKickInWorld", false);
m_configs[CONFIG_INTERVAL_LOG_UPDATE] = sConfig.GetIntDefault("RecordUpdateTimeDiffInterval", 60000);
m_configs[CONFIG_MIN_LOG_UPDATE] = sConfig.GetIntDefault("MinRecordUpdateTimeDiff", 10);
+ m_configs[CONFIG_NUMTHREADS] = sConfig.GetIntDefault("MapUpdate.Threads",1);
std::string forbiddenmaps = sConfig.GetStringDefault("ForbiddenMaps", "");
char * forbiddenMaps = new char[forbiddenmaps.length() + 1];
@@ -1596,8 +1597,10 @@ void World::Update(time_t diff)
sBattleGroundMgr.Update(diff);
RecordTimeDiff("UpdateBattleGroundMgr");
+
sOutdoorPvPMgr.Update(diff);
RecordTimeDiff("UpdateOutdoorPvPMgr");
+
}
RecordTimeDiff(NULL);
diff --git a/src/game/World.h b/src/game/World.h
index 32af277c8f5..1badcb36054 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -208,6 +208,8 @@ enum WorldConfigs
CONFIG_ENABLE_SINFO_LOGIN,
CONFIG_PREMATURE_BG_REWARD,
CONFIG_PET_LOS,
+ CONFIG_NUMTHREADS,
+
CONFIG_VALUE_COUNT
};
diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt
index 36d65544d3c..9205f145e48 100644
--- a/src/shared/CMakeLists.txt
+++ b/src/shared/CMakeLists.txt
@@ -24,5 +24,5 @@ SET(shared_STAT_SRCS
WorldPacket.h
SystemConfig.h
)
-
+add_definitions(-fopenmp)
add_library(shared STATIC ${shared_STAT_SRCS})
diff --git a/src/shared/Util.cpp b/src/shared/Util.cpp
index 26d2275ec2a..4624cacfde7 100644
--- a/src/shared/Util.cpp
+++ b/src/shared/Util.cpp
@@ -36,27 +36,52 @@ static MTRandTSS mtRand;
int32 irand (int32 min, int32 max)
{
- return int32 (mtRand.get ().randInt (max - min)) + min;
+ int32 result;
+#pragma omp critical (mtrand)
+{
+ result = mtRand.get ().randInt (max-min) + min;
+}
+ return result;
}
uint32 urand (uint32 min, uint32 max)
{
- return mtRand.get ().randInt (max - min) + min;
+ uint32 result;
+#pragma omp critical (mtrand)
+{
+ result = mtRand.get ().randInt (max - min) + min;
+}
+ return result;
}
int32 rand32 ()
{
- return mtRand.get ().randInt ();
+ int32 result;
+#pragma omp critical (mtrand)
+{
+ result = mtRand.get ().randInt ();
+}
+ return result;
}
double rand_norm(void)
{
- return mtRand.get ().randExc ();
+ double result;
+#pragma omp critical (mtrand)
+{
+ result = mtRand.get ().randExc ();
+}
+ return result;
}
double rand_chance (void)
{
- return mtRand.get ().randExc (100.0);
+ double result;
+#pragma omp critical (mtrand)
+{
+ result = mtRand.get ().randExc (100.0);
+}
+ return result;
}
Tokens StrSplit(const std::string &src, const std::string &sep)
diff --git a/src/trinitycore/CMakeLists.txt b/src/trinitycore/CMakeLists.txt
index 0a9801c5a19..268408fe639 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 66884c6d85b..cc8b3d75715 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -179,6 +179,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
@@ -204,6 +208,7 @@ TargetPosRecalculateRange = 1.5
UpdateUptimeInterval = 10
MaxCoreStuckTime = 0
AddonChannel = 1
+MapUpdate.Threads = 1
###################################################################################################################
# SERVER LOGGING
diff --git a/src/trinityrealm/CMakeLists.txt b/src/trinityrealm/CMakeLists.txt
index f883259bbf5..281f7ccf947 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}