Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2012-09-22 19:11:34 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:44:35 +0300
commit7d6779867e3858841dc31e97c2543126d99300bf (patch)
treeceb00b7dec05e72ee09b02c1da5428ef5b0fc826 /generator/feature_generator.cpp
parentf9eef1f83ba0c9640543e13f2e6867ad2b0de24a (diff)
Multithreaded coastlines generation. Second attempt :)
Diffstat (limited to 'generator/feature_generator.cpp')
-rw-r--r--generator/feature_generator.cpp39
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)
{