diff options
author | vng <viktor.govako@gmail.com> | 2012-05-30 03:41:36 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:39:01 +0300 |
commit | e9ff94fabc74513d5332ef7e4686b05209db75db (patch) | |
tree | 04eea8eee4dd4fd96fae14914161362b306c287c /generator/feature_generator.cpp | |
parent | 4579bdf8ae2c086ba54ac108b43d917d5f90c7fa (diff) |
[generator] Parallel coastline features generation (--make_coasts).
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 e1d8678594..c27f107f55 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" @@ -332,6 +333,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) @@ -342,16 +369,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) { |