From 7d6779867e3858841dc31e97c2543126d99300bf Mon Sep 17 00:00:00 2001 From: vng Date: Sat, 22 Sep 2012 18:11:34 +0300 Subject: Multithreaded coastlines generation. Second attempt :) --- generator/feature_generator.cpp | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) (limited to 'generator/feature_generator.cpp') diff --git a/generator/feature_generator.cpp b/generator/feature_generator.cpp index 4e23c671ac..a5592fb343 100644 --- a/generator/feature_generator.cpp +++ b/generator/feature_generator.cpp @@ -6,6 +6,7 @@ #include "generate_info.hpp" #include "coastlines_generator.hpp" #include "world_map_generator.hpp" +#include "multiproducer_oneconsumer.hpp" #include "../defines.hpp" @@ -335,6 +336,32 @@ public: } } +private: + class CoastFeatureTask : public MultiProducerOneConsumer::ITask + { + MainFeaturesEmitter & m_parent; + size_t m_ind; + + public: + CoastFeatureTask(MainFeaturesEmitter & parent, size_t ind) + : m_parent(parent), m_ind(ind) {} + + virtual void RunBase() + { + vector vecFb; + m_parent.m_coasts->GetFeatures(m_ind, vecFb); + + for (size_t i = 0; i< vecFb.size(); ++i) + Emit(&vecFb[i]); + } + + virtual void EmitBase(void * p) + { + (*m_parent.m_coastsHolder)(*reinterpret_cast(p)); + } + }; + +public: void Finish() { if (m_world) @@ -345,16 +372,12 @@ public: m_coasts->Finish(); size_t const count = m_coasts->GetCellsCount(); - LOG(LINFO, ("Generating coastline polygons", count)); + LOG(LINFO, ("Generating coastline features for ", count, " cells.")); + MultiProducerOneConsumer runner(8); for (size_t i = 0; i < count; ++i) - { - vector vecFb; - m_coasts->GetFeatures(i, vecFb); - - for (size_t j = 0; j < vecFb.size(); ++j) - (*m_coastsHolder)(vecFb[j]); - } + runner.RunTask(new CoastFeatureTask(*this, i)); + runner.Finish(); } else if (m_coastsHolder) { -- cgit v1.2.3