Skip to content

Commit e74e0c1

Browse files
authored
Merge pull request #1144 from joto/refactor-dependency-tracking-step1
Refactor dependency tracking step1
2 parents d68ae6e + 4a8d39e commit e74e0c1

File tree

12 files changed

+15
-178
lines changed

12 files changed

+15
-178
lines changed

src/middle-pgsql.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,8 +445,6 @@ void middle_pgsql_t::iterate_ways(middle_t::pending_processor &pf)
445445
while (id_tracker::is_valid(id = m_ways_pending_tracker->pop_mark())) {
446446
pf.enqueue_ways(id);
447447
}
448-
// in case we had higher ones than the middle
449-
pf.enqueue_ways(id_tracker::max());
450448

451449
//let the threads work on them
452450
pf.process_ways();

src/osmdata.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,10 @@ struct pending_threaded_processor : public middle_t::pending_processor
244244
void enqueue_ways(osmid_t id) override
245245
{
246246
for (size_t i = 0; i < outs.size(); ++i) {
247-
outs[i]->enqueue_ways(queue, id, i, ids_queued);
247+
if (outs[i]->need_forward_dependencies()) {
248+
queue.emplace(id, i);
249+
++ids_queued;
250+
}
248251
}
249252
}
250253

src/output-flex.cpp

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,49 +1002,6 @@ void output_flex_t::call_process_function(int index,
10021002
}
10031003
}
10041004

1005-
void output_flex_t::enqueue_ways(pending_queue_t &job_queue, osmid_t id,
1006-
std::size_t output_id, std::size_t &added)
1007-
{
1008-
osmid_t const prev = m_ways_pending_tracker.last_returned();
1009-
if (id_tracker::is_valid(prev) && prev >= id) {
1010-
if (prev > id) {
1011-
job_queue.push(pending_job_t(id, output_id));
1012-
}
1013-
// already done the job
1014-
return;
1015-
}
1016-
1017-
//make sure we get the one passed in
1018-
if (!m_ways_done_tracker->is_marked(id) && id_tracker::is_valid(id)) {
1019-
job_queue.push(pending_job_t(id, output_id));
1020-
++added;
1021-
}
1022-
1023-
//grab the first one or bail if its not valid
1024-
osmid_t popped = m_ways_pending_tracker.pop_mark();
1025-
if (!id_tracker::is_valid(popped)) {
1026-
return;
1027-
}
1028-
1029-
//get all the ones up to the id that was passed in
1030-
while (popped < id) {
1031-
if (!m_ways_done_tracker->is_marked(popped)) {
1032-
job_queue.push(pending_job_t(popped, output_id));
1033-
++added;
1034-
}
1035-
popped = m_ways_pending_tracker.pop_mark();
1036-
}
1037-
1038-
//make sure to get this one as well and move to the next
1039-
if (popped > id) {
1040-
if (!m_ways_done_tracker->is_marked(popped) &&
1041-
id_tracker::is_valid(popped)) {
1042-
job_queue.push(pending_job_t(popped, output_id));
1043-
++added;
1044-
}
1045-
}
1046-
}
1047-
10481005
void output_flex_t::pending_way(osmid_t id, int exists)
10491006
{
10501007
if (!m_has_process_way) {
@@ -1292,7 +1249,6 @@ output_flex_t::output_flex_t(
12921249
std::shared_ptr<id_tracker> ways_tracker,
12931250
std::shared_ptr<id_tracker> rels_tracker)
12941251
: output_t(mid, o), m_tables(std::move(tables)),
1295-
m_ways_done_tracker(new id_tracker{}),
12961252
m_stage2_ways_tracker(std::move(ways_tracker)),
12971253
m_stage2_rels_tracker(std::move(rels_tracker)), m_copy_thread(copy_thread),
12981254
m_lua_state(std::move(lua_state)), m_builder(o.projection),
@@ -1414,7 +1370,7 @@ void output_flex_t::init_lua(std::string const &filename)
14141370

14151371
bool output_flex_t::has_pending() const
14161372
{
1417-
return !m_ways_pending_tracker.empty() || !m_rels_pending_tracker.empty();
1373+
return !m_rels_pending_tracker.empty();
14181374
}
14191375

14201376
void output_flex_t::stage2_proc()

src/output-flex.hpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ class output_flex_t : public output_t
6161

6262
void stage2_proc() override;
6363

64-
void enqueue_ways(pending_queue_t &job_queue, osmid_t id,
65-
std::size_t output_id, std::size_t &added) override;
6664
void pending_way(osmid_t id, int exists) override;
6765

6866
void enqueue_relations(pending_queue_t &job_queue, osmid_t id,
@@ -139,9 +137,7 @@ class output_flex_t : public output_t
139137
std::shared_ptr<std::vector<flex_table_t>> m_tables;
140138
std::vector<table_connection_t> m_table_connections;
141139

142-
id_tracker m_ways_pending_tracker;
143140
id_tracker m_rels_pending_tracker;
144-
std::shared_ptr<id_tracker> m_ways_done_tracker;
145141

146142
std::shared_ptr<id_tracker> m_stage2_ways_tracker;
147143
std::shared_ptr<id_tracker> m_stage2_rels_tracker;

src/output-gazetteer.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class output_gazetteer_t : public output_t
4646
void stop(osmium::thread::Pool *) override {}
4747
void commit() override;
4848

49-
void enqueue_ways(pending_queue_t &, osmid_t, size_t, size_t &) override {}
49+
bool need_forward_dependencies() const noexcept override { return false; }
50+
5051
void pending_way(osmid_t, int) override {}
5152

5253
void enqueue_relations(pending_queue_t &, osmid_t, size_t,

src/output-multi.cpp

Lines changed: 2 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ output_multi_t::output_multi_t(
2828
export_list.normal_columns(m_osm_type),
2929
m_options.hstore_columns, m_processor->srid(),
3030
m_options.append, m_options.hstore_mode, copy_thread}),
31-
ways_done_tracker(new id_tracker{}),
3231
m_expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox,
3332
m_options.projection),
3433
buffer(1024, osmium::memory::Buffer::auto_grow::yes),
@@ -44,10 +43,6 @@ output_multi_t::output_multi_t(
4443
m_processor(other->m_processor), m_proj(other->m_proj),
4544
m_osm_type(other->m_osm_type),
4645
m_table(new table_t{*other->m_table, copy_thread}),
47-
// NOTE: we need to know which ways were used by relations so each thread
48-
// must have a copy of the original marked done ways, its read only so its
49-
// ok
50-
ways_done_tracker(other->ways_done_tracker),
5146
m_expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox,
5247
m_options.projection),
5348
buffer(1024, osmium::memory::Buffer::auto_grow::yes),
@@ -72,50 +67,7 @@ void output_multi_t::start()
7267

7368
bool output_multi_t::has_pending() const
7469
{
75-
return !ways_pending_tracker.empty() || !rels_pending_tracker.empty();
76-
}
77-
78-
void output_multi_t::enqueue_ways(pending_queue_t &job_queue, osmid_t id,
79-
size_t output_id, size_t &added)
80-
{
81-
osmid_t const prev = ways_pending_tracker.last_returned();
82-
if (id_tracker::is_valid(prev) && prev >= id) {
83-
if (prev > id) {
84-
job_queue.push(pending_job_t(id, output_id));
85-
}
86-
// already done the job
87-
return;
88-
}
89-
90-
//make sure we get the one passed in
91-
if (!ways_done_tracker->is_marked(id) && id_tracker::is_valid(id)) {
92-
job_queue.push(pending_job_t(id, output_id));
93-
++added;
94-
}
95-
96-
//grab the first one or bail if its not valid
97-
osmid_t popped = ways_pending_tracker.pop_mark();
98-
if (!id_tracker::is_valid(popped)) {
99-
return;
100-
}
101-
102-
//get all the ones up to the id that was passed in
103-
while (popped < id) {
104-
if (!ways_done_tracker->is_marked(popped)) {
105-
job_queue.push(pending_job_t(popped, output_id));
106-
++added;
107-
}
108-
popped = ways_pending_tracker.pop_mark();
109-
}
110-
111-
//make sure to get this one as well and move to the next
112-
if (popped > id) {
113-
if (!ways_done_tracker->is_marked(popped) &&
114-
id_tracker::is_valid(popped)) {
115-
job_queue.push(pending_job_t(popped, output_id));
116-
++added;
117-
}
118-
}
70+
return !rels_pending_tracker.empty();
11971
}
12072

12173
void output_multi_t::pending_way(osmid_t id, int exists)
@@ -332,15 +284,7 @@ void output_multi_t::process_way(osmium::Way *way)
332284
auto const geom = m_processor->process_way(*way, &m_builder);
333285

334286
if (!geom.empty()) {
335-
//if we are also interested in relations we need to mark
336-
//this way pending just in case it shows up in one
337-
if (m_processor->interests(geometry_processor::interest_relation)) {
338-
ways_pending_tracker.mark(way->id());
339-
} else {
340-
// We wouldn't be interested in this as a relation, so no need to mark it pending.
341-
// TODO: Does this imply anything for non-multipolygon relations?
342-
copy_to_table(way->id(), geom, outtags);
343-
}
287+
copy_to_table(way->id(), geom, outtags);
344288
}
345289
}
346290
}

src/output-multi.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ class output_multi_t : public output_t
4646
void stop(osmium::thread::Pool *pool) override;
4747
void commit() override;
4848

49-
void enqueue_ways(pending_queue_t &job_queue, osmid_t id, size_t output_id,
50-
size_t &added) override;
5149
void pending_way(osmid_t id, int exists) override;
5250

5351
void enqueue_relations(pending_queue_t &job_queue, osmid_t id,
@@ -87,8 +85,7 @@ class output_multi_t : public output_t
8785
std::shared_ptr<reprojection> m_proj;
8886
osmium::item_type const m_osm_type;
8987
std::unique_ptr<table_t> m_table;
90-
id_tracker ways_pending_tracker, rels_pending_tracker;
91-
std::shared_ptr<id_tracker> ways_done_tracker;
88+
id_tracker rels_pending_tracker;
9289
expire_tiles m_expire;
9390
relation_helper m_relation_helper;
9491
osmium::memory::Buffer buffer;

src/output-null.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ class output_null_t : public output_t
2222
void commit() override {}
2323
void cleanup() {}
2424

25-
void enqueue_ways(pending_queue_t & /*job_queue*/, osmid_t /*id*/, size_t /*output_id*/,
26-
size_t & /*added*/) override
27-
{}
25+
bool need_forward_dependencies() const noexcept override { return false; }
2826

2927
void pending_way(osmid_t /*id*/, int /*exists*/) override {}
3028

src/output-pgsql.cpp

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -66,49 +66,6 @@ void output_pgsql_t::pgsql_out_way(osmium::Way const &way, taglist_t *tags,
6666
}
6767
}
6868

69-
void output_pgsql_t::enqueue_ways(pending_queue_t &job_queue, osmid_t id,
70-
size_t output_id, size_t &added)
71-
{
72-
osmid_t const prev = ways_pending_tracker.last_returned();
73-
if (id_tracker::is_valid(prev) && prev >= id) {
74-
if (prev > id) {
75-
job_queue.push(pending_job_t(id, output_id));
76-
}
77-
// already done the job
78-
return;
79-
}
80-
81-
//make sure we get the one passed in
82-
if (!ways_done_tracker->is_marked(id) && id_tracker::is_valid(id)) {
83-
job_queue.push(pending_job_t(id, output_id));
84-
++added;
85-
}
86-
87-
//grab the first one or bail if its not valid
88-
osmid_t popped = ways_pending_tracker.pop_mark();
89-
if (!id_tracker::is_valid(popped)) {
90-
return;
91-
}
92-
93-
//get all the ones up to the id that was passed in
94-
while (popped < id) {
95-
if (!ways_done_tracker->is_marked(popped)) {
96-
job_queue.push(pending_job_t(popped, output_id));
97-
++added;
98-
}
99-
popped = ways_pending_tracker.pop_mark();
100-
}
101-
102-
//make sure to get this one as well and move to the next
103-
if (popped > id) {
104-
if (!ways_done_tracker->is_marked(popped) &&
105-
id_tracker::is_valid(popped)) {
106-
job_queue.push(pending_job_t(popped, output_id));
107-
++added;
108-
}
109-
}
110-
}
111-
11269
void output_pgsql_t::pending_way(osmid_t id, int exists)
11370
{
11471
// Try to fetch the way from the DB
@@ -436,7 +393,6 @@ output_pgsql_t::output_pgsql_t(
436393
std::shared_ptr<db_copy_thread_t> const &copy_thread)
437394
: output_t(mid, o), m_builder(o.projection),
438395
expire(o.expire_tiles_zoom, o.expire_tiles_max_bbox, o.projection),
439-
ways_done_tracker(new id_tracker{}),
440396
buffer(32768, osmium::memory::Buffer::auto_grow::yes),
441397
rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes)
442398
{
@@ -495,9 +451,6 @@ output_pgsql_t::output_pgsql_t(
495451
m_builder(m_options.projection),
496452
expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox,
497453
m_options.projection),
498-
//NOTE: we need to know which ways were used by relations so each thread
499-
//must have a copy of the original marked done ways, its read only so its ok
500-
ways_done_tracker(other->ways_done_tracker),
501454
buffer(1024, osmium::memory::Buffer::auto_grow::yes),
502455
rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes)
503456
{
@@ -512,7 +465,7 @@ output_pgsql_t::~output_pgsql_t() = default;
512465

513466
bool output_pgsql_t::has_pending() const
514467
{
515-
return !ways_pending_tracker.empty() || !rels_pending_tracker.empty();
468+
return !rels_pending_tracker.empty();
516469
}
517470

518471
void output_pgsql_t::merge_pending_relations(output_t *other)

src/output-pgsql.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ class output_pgsql_t : public output_t
4646
void stop(osmium::thread::Pool *pool) override;
4747
void commit() override;
4848

49-
void enqueue_ways(pending_queue_t &job_queue, osmid_t id, size_t output_id,
50-
size_t &added) override;
5149
void pending_way(osmid_t id, int exists) override;
5250

5351
void enqueue_relations(pending_queue_t &job_queue, osmid_t id,
@@ -88,8 +86,7 @@ class output_pgsql_t : public output_t
8886
geom::osmium_builder_t m_builder;
8987
expire_tiles expire;
9088

91-
id_tracker ways_pending_tracker, rels_pending_tracker;
92-
std::shared_ptr<id_tracker> ways_done_tracker;
89+
id_tracker rels_pending_tracker;
9390
osmium::memory::Buffer buffer;
9491
osmium::memory::Buffer rels_buffer;
9592
};

0 commit comments

Comments
 (0)