Skip to content

Multiple orthogonal state components reacting to the same event can result in incorrect state transition #23

@mkatliar

Description

@mkatliar

Consider an example state machine:
orthogonal_regions

#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/transition.hpp>
#include <boost/mpl/list.hpp>
 
#include <iostream>
 
struct Main;
struct A0;
struct B0;
struct A1;
struct B1;
 
struct Event : boost::statechart::event<Event> {};
struct Machine : boost::statechart::state_machine<Machine, Main> {};
struct Main : boost::statechart::simple_state<Main, Machine, boost::mpl::list<A0, A1>> {};
 
 
struct A0 : boost::statechart::simple_state<A0, Main::orthogonal<0>>
{
   using reactions = boost::statechart::transition<Event, B0>;
   A0() { std::cout << "Enter A0" << std::endl; }
   ~A0() { std::cout << "Exit A0" << std::endl; }
};
 
struct B0 : boost::statechart::simple_state<B0, Main::orthogonal<0>>
{
   B0() { std::cout << "Enter B0" << std::endl; }
   ~B0() { std::cout << "Exit B0" << std::endl; }
};
 
struct A1 : boost::statechart::simple_state<A1, Main::orthogonal<1>>
{
   using reactions = boost::statechart::transition<Event, B1>;
   A1() { std::cout << "Enter A1" << std::endl; }
   ~A1() { std::cout << "Exit A1" << std::endl; }
};
 
struct B1 : boost::statechart::simple_state<B1, Main::orthogonal<1>>
{
   B1() { std::cout << "Enter B1" << std::endl; }
   ~B1() { std::cout << "Exit B1" << std::endl; }
};
 
 
int main(int, char**)
{
   Machine machine;
   machine.initiate();
   machine.process_event(Event {});
 
   return 0;
}

Running the example outputs:

Enter A0
Enter A1
Exit A0
Enter B0
Exit A1
Exit B0

The machine transitions (A0, A1)->(B0, A1), although the correct transition is (A0, A1)->(B0, B1).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions