Skip to content

Commit db6895f

Browse files
GuiCodronkris-jusiak
authored andcommitted
Update process event strategy
Fix process_defer_events return value. Loop on process_defer_events until stability is reached. Remove process_defer_events after process_queued_events since it was used as stopgag when process_defer_events return value was erroneous.
1 parent 762f40c commit db6895f

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed

include/boost/sml.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,11 +1345,11 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
13451345
process_event_noexcept<get_event_mapping_t<get_generic_t<TEvent>, mappings>>(event, deps, subs, has_exceptions{});
13461346
#endif
13471347
do {
1348-
while (process_internal_events(anonymous{}, deps, subs)) {
1349-
}
1350-
process_defer_events(deps, subs, handled, aux::type<defer_queue_t<TEvent>>{}, events_t{});
1351-
} while (process_queued_events(deps, subs, aux::type<process_queue_t<TEvent>>{}, events_t{}) ||
1352-
process_internal_events(anonymous{}, deps, subs));
1348+
do {
1349+
while (process_internal_events(anonymous{}, deps, subs)) {
1350+
}
1351+
} while (process_defer_events(deps, subs, handled, aux::type<defer_queue_t<TEvent>>{}, events_t{}));
1352+
} while (process_queued_events(deps, subs, aux::type<process_queue_t<TEvent>>{}, events_t{}));
13531353
return handled;
13541354
}
13551355
void initialize(const aux::type_list<> &) {}
@@ -1531,6 +1531,7 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
15311531
#endif
15321532
if (handled && defer_again_) {
15331533
++defer_it_;
1534+
return false;
15341535
} else {
15351536
defer_.erase(defer_it_);
15361537
defer_it_ = defer_.begin();
@@ -1550,9 +1551,8 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
15501551
defer_again_ = false;
15511552
defer_it_ = defer_.begin();
15521553
defer_end_ = defer_.end();
1553-
processed_events = defer_it_ != defer_end_;
15541554
while (defer_it_ != defer_end_) {
1555-
(this->*dispatch_table[defer_it_->id])(deps, subs, defer_it_->data);
1555+
processed_events |= (this->*dispatch_table[defer_it_->id])(deps, subs, defer_it_->data);
15561556
defer_again_ = false;
15571557
}
15581558
defer_processing_ = false;

include/boost/sml/back/state_machine.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,11 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
8888
#endif // __pph__
8989
// Repeat internal transition until there is no more to process.
9090
do {
91-
while (process_internal_events(anonymous{}, deps, subs)) {
92-
}
93-
process_defer_events(deps, subs, handled, aux::type<defer_queue_t<TEvent>>{}, events_t{});
94-
} while (process_queued_events(deps, subs, aux::type<process_queue_t<TEvent>>{}, events_t{}) ||
95-
process_internal_events(anonymous{}, deps, subs));
91+
do {
92+
while (process_internal_events(anonymous{}, deps, subs)) {
93+
}
94+
} while (process_defer_events(deps, subs, handled, aux::type<defer_queue_t<TEvent>>{}, events_t{}));
95+
} while (process_queued_events(deps, subs, aux::type<process_queue_t<TEvent>>{}, events_t{}));
9696

9797
return handled;
9898
}
@@ -299,6 +299,7 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
299299
#endif // __pph__
300300
if (handled && defer_again_) {
301301
++defer_it_;
302+
return false;
302303
} else {
303304
defer_.erase(defer_it_);
304305
defer_it_ = defer_.begin();
@@ -319,9 +320,8 @@ struct sm_impl : aux::conditional_t<aux::is_empty<typename TSM::sm>::value, aux:
319320
defer_again_ = false;
320321
defer_it_ = defer_.begin();
321322
defer_end_ = defer_.end();
322-
processed_events = defer_it_ != defer_end_;
323323
while (defer_it_ != defer_end_) {
324-
(this->*dispatch_table[defer_it_->id])(deps, subs, defer_it_->data);
324+
processed_events |= (this->*dispatch_table[defer_it_->id])(deps, subs, defer_it_->data);
325325
defer_again_ = false;
326326
}
327327
defer_processing_ = false;

0 commit comments

Comments
 (0)