Skip to content

Commit f9e78b3

Browse files
committed
planner_multi: substitute map to track request counts
Problem: when updating the Fluxion resource graph `request_multi` `counts`' indices can be reordered. Reordering will cause inconsistent lookups. Update the `request_multi` `counts` to be map-based to handle reordering of indices.
1 parent ccf5abc commit f9e78b3

File tree

3 files changed

+10
-6
lines changed

3 files changed

+10
-6
lines changed

resource/planner/c++/planner_multi.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ planner_multi::planner_multi (int64_t base_time, uint64_t duration,
5050
errno = ENOMEM;
5151
throw std::bad_alloc ();
5252
}
53-
m_iter.counts.push_back (0);
53+
m_iter.counts[type] = 0;
5454
m_types_totals_planners.push_back ({type, resource_totals[i], p});
5555
}
5656
m_span_counter = 0;
@@ -82,8 +82,8 @@ planner_multi::planner_multi (const planner_multi &o)
8282
m_types_totals_planners.push_back ({iter.resource_type,
8383
iter.resource_total, np});
8484
}
85-
m_span_lookup = o.m_span_lookup;
8685
m_iter = o.m_iter;
86+
m_span_lookup = o.m_span_lookup;
8787
m_span_lookup_iter = o.m_span_lookup_iter;
8888
m_span_counter = o.m_span_counter;
8989
}
@@ -119,8 +119,8 @@ planner_multi &planner_multi::operator= (const planner_multi &o)
119119
m_types_totals_planners.push_back ({iter.resource_type,
120120
iter.resource_total, np});
121121
}
122-
m_span_lookup = o.m_span_lookup;
123122
m_iter = o.m_iter;
123+
m_span_lookup = o.m_span_lookup;
124124
m_span_lookup_iter = o.m_span_lookup_iter;
125125
m_span_counter = o.m_span_counter;
126126

resource/planner/c++/planner_multi.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#define PLANNER_MULTI_HPP
1313

1414
#include "planner.hpp"
15+
#include <unordered_map>
1516
#include <boost/multi_index_container.hpp>
1617
#include <boost/multi_index/member.hpp>
1718
#include <boost/multi_index/random_access_index.hpp>
@@ -20,7 +21,7 @@
2021
struct request_multi {
2122
int64_t on_or_after = 0;
2223
uint64_t duration = 0;
23-
std::vector<int64_t> counts;
24+
std::unordered_map<std::string, int64_t> counts;
2425
};
2526

2627
struct planner_multi_meta {

resource/planner/c/planner_multi_c_interface.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ static void fill_iter_request (planner_multi_t *ctx, struct request_multi *iter,
3232
iter->on_or_after = at;
3333
iter->duration = duration;
3434
for (i = 0; i < len; ++i)
35-
iter->counts[i] = resources[i];
35+
iter->counts[ctx->plan_multi->get_resource_type_at (i)] =
36+
resources[i];
3637
}
3738

3839
extern "C" planner_multi_t *planner_multi_new (
@@ -261,6 +262,7 @@ extern "C" int64_t planner_multi_avail_time_next (planner_multi_t *ctx)
261262
size_t i = 0;
262263
int unmet = 0;
263264
int64_t t = -1;
265+
std::string type;
264266

265267
if (!ctx) {
266268
errno = EINVAL;
@@ -272,9 +274,10 @@ extern "C" int64_t planner_multi_avail_time_next (planner_multi_t *ctx)
272274
ctx->plan_multi->get_planner_at (static_cast<size_t> (0)))) == -1)
273275
break;
274276
for (i = 1; i < ctx->plan_multi->get_planners_size (); ++i) {
277+
type = ctx->plan_multi->get_resource_type_at (i);
275278
if ((unmet = planner_avail_during (ctx->plan_multi->get_planner_at (i), t,
276279
ctx->plan_multi->get_iter ().duration,
277-
ctx->plan_multi->get_iter ().counts[i])) == -1)
280+
ctx->plan_multi->get_iter ().counts.at (type))) == -1)
278281
break;
279282
}
280283
} while (unmet);

0 commit comments

Comments
 (0)