aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/collision/Management/VMapManager2.cpp1
-rw-r--r--src/server/shared/Threading/ProducerConsumerQueue.h2
-rw-r--r--src/tools/mmaps_generator/CMakeLists.txt2
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp83
-rw-r--r--src/tools/mmaps_generator/MapBuilder.h9
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp2
6 files changed, 62 insertions, 37 deletions
diff --git a/src/server/collision/Management/VMapManager2.cpp b/src/server/collision/Management/VMapManager2.cpp
index 00381cb1205..1d267cbd2a5 100644
--- a/src/server/collision/Management/VMapManager2.cpp
+++ b/src/server/collision/Management/VMapManager2.cpp
@@ -18,7 +18,6 @@
#include <iostream>
#include <iomanip>
-#include <mutex>
#include <string>
#include <sstream>
#include "VMapManager2.h"
diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/server/shared/Threading/ProducerConsumerQueue.h
index 41bff445c2e..3fefd27ba6e 100644
--- a/src/server/shared/Threading/ProducerConsumerQueue.h
+++ b/src/server/shared/Threading/ProducerConsumerQueue.h
@@ -47,7 +47,7 @@ public:
_condition.notify_one();
}
- bool Empty() const
+ bool Empty()
{
std::lock_guard<std::mutex> lock(_queueLock);
diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt
index f38ecc5144d..a2b729ca998 100644
--- a/src/tools/mmaps_generator/CMakeLists.txt
+++ b/src/tools/mmaps_generator/CMakeLists.txt
@@ -22,6 +22,7 @@ set(mmap_gen_Includes
${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour/Include
${CMAKE_SOURCE_DIR}/src/server/shared
${CMAKE_SOURCE_DIR}/src/server/shared/Utilities
+ ${CMAKE_SOURCE_DIR}/src/server/shared/Threading
${CMAKE_SOURCE_DIR}/src/server/game/Conditions
${CMAKE_SOURCE_DIR}/src/server/collision
${CMAKE_SOURCE_DIR}/src/server/collision/Management
@@ -47,6 +48,7 @@ target_link_libraries(mmaps_generator
Detour
${BZIP2_LIBRARIES}
${ZLIB_LIBRARIES}
+ ${Boost_LIBRARIES}
)
if( UNIX )
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
index fdd8a7d177a..3b1516b3d11 100644
--- a/src/tools/mmaps_generator/MapBuilder.cpp
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -165,42 +165,59 @@ namespace MMAP
}
/**************************************************************************/
+
+ void MapBuilder::WorkerThread()
+ {
+ while (1)
+ {
+ uint32 mapId;
+
+ _queue.WaitAndPop(mapId);
+
+ if (_cancelationToken)
+ return;
+
+ buildMap(mapId);
+ }
+ }
+
void MapBuilder::buildAllMaps(int threads)
{
+ for (size_t i = 0; i < threads; ++i)
+ {
+ _workerThreads.push_back(std::thread(&MapBuilder::WorkerThread, this));
+ }
+
+ m_tiles.sort([](MapTiles a, MapTiles b)
+ {
+ return a.m_tiles->size() > b.m_tiles->size();
+ });
-// TODO fix that shit
-// std::vector<BuilderThread*> _threads;
-//
-// BuilderThreadPool* pool = threads > 0 ? new BuilderThreadPool() : NULL;
-//
-// m_tiles.sort([](MapTiles a, MapTiles b)
-// {
-// return a.m_tiles->size() > b.m_tiles->size();
-// });
-//
-// for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it)
-// {
-// uint32 mapID = it->m_mapId;
-// if (!shouldSkipMap(mapID))
-// {
-// if (threads > 0)
-// pool->Enqueue(new MapBuildRequest(mapID));
-// else
-// buildMap(mapID);
-// }
-// }
-//
-// for (int i = 0; i < threads; ++i)
-// _threads.push_back(new BuilderThread(this, pool->Queue()));
-//
-// // Free memory
-// for (std::vector<BuilderThread*>::iterator _th = _threads.begin(); _th != _threads.end(); ++_th)
-// {
-// (*_th)->wait();
-// delete *_th;
-// }
-//
-// delete pool;
+ for (TileList::iterator it = m_tiles.begin(); it != m_tiles.end(); ++it)
+ {
+ uint32 mapID = it->m_mapId;
+ if (!shouldSkipMap(mapID))
+ {
+ if (threads > 0)
+ _queue.Push(mapID);
+ else
+ buildMap(mapID);
+ }
+ }
+
+ while (!_queue.Empty())
+ {
+ std::this_thread::sleep_for(std::chrono::milliseconds(1000));
+ }
+
+ _cancelationToken = true;
+
+ _queue.Cancel();
+
+ for (auto& thread : _workerThreads)
+ {
+ thread.join();
+ }
}
/**************************************************************************/
diff --git a/src/tools/mmaps_generator/MapBuilder.h b/src/tools/mmaps_generator/MapBuilder.h
index c9ea03190a8..4cd36602a4b 100644
--- a/src/tools/mmaps_generator/MapBuilder.h
+++ b/src/tools/mmaps_generator/MapBuilder.h
@@ -23,12 +23,15 @@
#include <set>
#include <map>
#include <list>
+#include <atomic>
+#include <thread>
#include "TerrainBuilder.h"
#include "IntermediateValues.h"
#include "Recast.h"
#include "DetourNavMesh.h"
+#include "ProducerConsumerQueue.h"
using namespace VMAP;
@@ -96,6 +99,8 @@ namespace MMAP
// builds list of maps, then builds all of mmap tiles (based on the skip settings)
void buildAllMaps(int threads);
+ void MapBuilder::WorkerThread();
+
private:
// detect maps and tiles
void discoverTiles();
@@ -138,6 +143,10 @@ namespace MMAP
// build performance - not really used for now
rcContext* m_rcContext;
+
+ std::vector<std::thread> _workerThreads;
+ ProducerConsumerQueue<uint32> _queue;
+ std::atomic<bool> _cancelationToken;
};
}
diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp
index 7832cef18de..771275a1757 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.cpp
+++ b/src/tools/mmaps_generator/TerrainBuilder.cpp
@@ -18,13 +18,11 @@
#include "TerrainBuilder.h"
-#include "PathCommon.h"
#include "MapBuilder.h"
#include "VMapManager2.h"
#include "MapTree.h"
#include "ModelInstance.h"
-#include <vector>
// ******************************************
// Map file format defines