Skip to content

Commit 0387da0

Browse files
J-Meyerskris-jusiak
authored andcommitted
Adds handling information about events added to the process_queue
1 parent ef0f2fd commit 0387da0

File tree

4 files changed

+30
-28
lines changed

4 files changed

+30
-28
lines changed

example/defer_and_process.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ struct defer_and_process {
2525
return make_transition_table(
2626
*"idle"_s + event<e1> / defer
2727
, "idle"_s + event<e2> = "s1"_s
28-
, "s1"_s + event<e1> = "s2"_s
28+
, "s1"_s + event<e1> / process(e2{}) = "s2"_s
2929
, "s2"_s + event<e3> / process(e4{})
3030
, "s2"_s + event<e4> = X
3131
);
@@ -40,12 +40,13 @@ int main() {
4040
sm; /// defer_queue policy to enable deferred events using std::queue
4141
assert(sm.is("idle"_s));
4242

43-
sm.process_event(e1{});
43+
assert(sm.process_event(e1{}));
4444
assert(sm.is("idle"_s));
4545

46-
sm.process_event(e2{}); /// triggers idle -> s1 and s1 -> s2 (via deferred e1)
46+
assert(!sm.process_event(e2{})); /// triggers idle -> s1 and s1 -> s2 (via deferred e1)
47+
/// additionally triggers e2 again which is unhandled so it returns false
4748
assert(sm.is("s2"_s));
4849

49-
sm.process_event(e3{}); /// triggers s2.process(e4) -> X (via processed e4)
50+
assert(sm.process_event(e3{})); /// triggers s2.process(e4) -> X (via processed e4)
5051
assert(sm.is(sml::X));
5152
}

include/boost/sml.hpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -1426,13 +1426,14 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
14261426
const auto lock = thread_safety_.create_lock();
14271427
(void)lock;
14281428
bool handled = process_internal_events(event, deps, subs);
1429+
bool queued_handled = true;
14291430
do {
14301431
do {
14311432
while (process_internal_events(anonymous{}, deps, subs)) {
14321433
}
14331434
} while (process_defer_events(deps, subs, handled, aux::type<defer_queue_t<TEvent>>{}, events_t{}));
1434-
} while (process_queued_events(deps, subs, aux::type<process_queue_t<TEvent>>{}, events_t{}));
1435-
return handled;
1435+
} while (process_queued_events(deps, subs, queued_handled, aux::type<process_queue_t<TEvent>>{}, events_t{}));
1436+
return handled && queued_handled;
14361437
}
14371438
constexpr void initialize(const aux::type_list<> &) {}
14381439
template <class TState>
@@ -1639,7 +1640,7 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
16391640
return processed_events;
16401641
}
16411642
template <class TDeps, class TSubs, class... TEvents>
1642-
constexpr bool process_queued_events(TDeps &, TSubs &, const aux::type<no_policy> &, const aux::type_list<TEvents...> &) {
1643+
constexpr bool process_queued_events(TDeps &, TSubs &, bool &, const aux::type<no_policy> &, const aux::type_list<TEvents...> &) {
16431644
return false;
16441645
}
16451646
template <class TDeps, class TSubs, class TEvent>
@@ -1654,13 +1655,13 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
16541655
#endif
16551656
}
16561657
template <class TDeps, class TSubs, class TDeferQueue, class... TEvents>
1657-
bool process_queued_events(TDeps &deps, TSubs &subs, const aux::type<TDeferQueue> &, const aux::type_list<TEvents...> &) {
1658+
bool process_queued_events(TDeps &deps, TSubs &subs, bool &queued_handled, const aux::type<TDeferQueue> &, const aux::type_list<TEvents...> &) {
16581659
using dispatch_table_t = bool (sm_impl::*)(TDeps &, TSubs &, const void *);
16591660
const static dispatch_table_t dispatch_table[__BOOST_SML_ZERO_SIZE_ARRAY_CREATE(sizeof...(TEvents))] = {
16601661
&sm_impl::process_event_no_queue<TDeps, TSubs, TEvents>...};
16611662
bool wasnt_empty = !process_.empty();
16621663
while (!process_.empty()) {
1663-
(this->*dispatch_table[process_.front().id])(deps, subs, process_.front().data);
1664+
queued_handled &= (this->*dispatch_table[process_.front().id])(deps, subs, process_.front().data);
16641665
process_.pop();
16651666
}
16661667
return wasnt_empty;

test/ft/actions_process.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,26 @@ test process_event_from_substate = [] {
8585
expect(sm.is(idle));
8686
expect(sm.is<decltype(sml::state<sub>)>(s1));
8787

88-
sm.process_event(e1{});
88+
expect(sm.process_event(e1{}));
8989
expect(sm.is(sml::state<sub>));
9090
expect(sm.is<decltype(sml::state<sub>)>(s1));
9191
expect(!c_.a_called);
9292

93-
sm.process_event(e1{});
93+
expect(sm.process_event(e1{}));
9494
expect(sm.is(sml::state<sub>));
9595
expect(sm.is<decltype(sml::state<sub>)>(s2));
9696
expect(!c_.a_called);
9797

98-
sm.process_event(e2{}); // + process(e3{})
98+
expect(!sm.process_event(e2{})); // + process(e3{}) + process(e2{})
9999
expect(sm.is(sml::state<sub>));
100100
expect(sm.is<decltype(sml::state<sub>)>(s3));
101101
expect(!c_.a_called);
102102

103-
sm.process_event(e3{});
103+
expect(sm.process_event(e3{}));
104104
expect(sm.is(sml::state<sub>));
105105
expect(sm.is<decltype(sml::state<sub>)>(sml::X));
106106

107-
sm.process_event(e4{});
107+
expect(sm.process_event(e4{}));
108108
expect(1 == c_.a_called);
109109
};
110110

@@ -148,7 +148,7 @@ test queue_and_internal_process_events = [] {
148148
return make_transition_table(
149149
* idle + on_entry<sml::initial> / process(e1())
150150
, s1 <= idle + event<e1>
151-
, s2 <= s1
151+
, s2 <= s1 / process(e1()) // This process is unhandled, but the state machine still transitions to s2
152152
, s2 + on_entry<_> / process(e2())
153153
, s3 <= s2 + event<e2>
154154
, X <= s3
@@ -186,7 +186,7 @@ test queue_process_reaction = [] {
186186

187187
sml::sm<c, sml::process_queue<std::queue>> sm{};
188188

189-
sm.process_event(e1());
189+
expect(!sm.process_event(e1())); // e3 was unexpected so it returns false
190190
expect(sm.is(sml::X));
191191

192192
const c& c_ = sm;
@@ -209,7 +209,7 @@ test mix_process_and_internal = [] {
209209

210210
sml::sm<c, sml::process_queue<std::queue>> sm{};
211211

212-
sm.process_event(e1{});
212+
expect(sm.process_event(e1{}));
213213
expect(sm.is(sml::X));
214214
};
215215

@@ -242,11 +242,11 @@ test process_event_sent_from_substate = [] {
242242
expect(sm.is(idle, s2));
243243
expect(sm.is<decltype(sml::state<sub>)>(s1));
244244

245-
sm.process_event(e1{});
245+
expect(sm.process_event(e1{}));
246246
expect(sm.is(sml::state<sub>, s2));
247247
expect(sm.is<decltype(sml::state<sub>)>(s1));
248248

249-
sm.process_event(e1{}); // + process(e2{})
249+
expect(sm.process_event(e1{})); // + process(e2{})
250250
expect(sm.is(sml::X, sml::X));
251251
expect(sm.is<decltype(sml::state<sub>)>(sml::X));
252252
};
@@ -279,10 +279,10 @@ test process_event_of_substate = [] {
279279
expect(sm.is(idle));
280280
expect(sm.is<decltype(sml::state<sub>)>(s1));
281281

282-
sm.process_event(e1{});
282+
expect(sm.process_event(e1{}));
283283
expect(sm.is(sml::state<sub>));
284284

285-
sm.process_event(e2{}); // + process(e2{})
285+
expect(sm.process_event(e2{})); // + process(e2{})
286286
expect(sm.is(sml::state<sub>));
287287
expect(sm.is<decltype(sml::state<sub>)>(sml::X));
288288
};
@@ -327,7 +327,7 @@ test process_between_substates = [] {
327327
expect(sm.is<decltype(sml::state<sub1>)>(s1));
328328
expect(sm.is<decltype(sml::state<sub2>)>(s2));
329329

330-
sm.process_event(e1{});
330+
expect(sm.process_event(e1{}));
331331
expect(sm.is(sml::X, sml::X));
332332
expect(sm.is<decltype(sml::state<sub1>)>(sml::X));
333333
expect(sm.is<decltype(sml::state<sub2>)>(sml::X));

test/ft/actions_process_n_defer.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,15 @@ test mix_process_n_defer = [] {
6262
, s3 + event<e2> / defer = s4
6363
, s4 + event<e2> = s5
6464
, s5 = s6
65-
, s6 + on_entry<_> / process(e3{})
65+
, s6 + on_entry<_> / (process(e1{}), process(e3{})) // e1 is not handled
6666
, s6 + event<e3> = s7
6767
, s7 = X
6868
);
6969
// clang-format on
7070
}
7171
}; // internal, defer, process, defer, internal, process, internal
7272
sml::sm<c, sml::process_queue<std::queue>, sml::defer_queue<std::deque>> sm{};
73-
sm.process_event(e1{});
73+
expect(!sm.process_event(e1{}));
7474
expect(sm.is(sml::X));
7575
};
7676

@@ -105,10 +105,10 @@ test process_n_defer_again = [] {
105105

106106
std::string calls;
107107
sml::sm<c, sml::process_queue<std::queue>, sml::defer_queue<std::deque>> sm{calls};
108-
sm.process_event(e1{});
109-
sm.process_event(e1{});
110-
sm.process_event(e1{});
111-
sm.process_event(e3{});
108+
expect(sm.process_event(e1{}));
109+
expect(sm.process_event(e1{}));
110+
expect(sm.process_event(e1{}));
111+
expect(sm.process_event(e3{}));
112112
expect(calls == "");
113113
sm.process_event(e2{});
114114
std::cout << calls << "\n";

0 commit comments

Comments
 (0)