diff options
author | vng <viktor.govako@gmail.com> | 2012-09-22 19:11:34 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:44:35 +0300 |
commit | 7d6779867e3858841dc31e97c2543126d99300bf (patch) | |
tree | ceb00b7dec05e72ee09b02c1da5428ef5b0fc826 /generator/feature_generator.cpp | |
parent | f9eef1f83ba0c9640543e13f2e6867ad2b0de24a (diff) |
Multithreaded coastlines generation. Second attempt :)
Diffstat (limited to 'generator/feature_generator.cpp')
-rw-r--r-- | generator/feature_generator.cpp | 39 |
1 files changed, 31 insertions, 8 deletions
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<FeatureBuilder1> 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<FeatureBuilder1 *>(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<FeatureBuilder1> 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) { |