FairMQ  1.3.8
C++ Message Passing Framework
StateMachine.h
1 /********************************************************************************
2  * Copyright (C) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
8 
9 #ifndef FAIR_MQ_STATEMACHINE_H
10 #define FAIR_MQ_STATEMACHINE_H
11 
12 #include <utility>
13 #include <FairMQLogger.h>
14 #include <fairmq/Tools.h>
15 #include <fairmq/EventManager.h>
16 #include <deque>
17 #include <functional>
18 #include <mutex>
19 #include <condition_variable>
20 #include <thread>
21 #include <unordered_map>
22 
23 namespace fair
24 {
25 namespace mq
26 {
27 
35 {
36  public:
37  enum class State : int
38  {
39  Ok,
40  Error,
41  Idle,
42  InitializingDevice,
43  DeviceReady,
44  InitializingTask,
45  Ready,
46  Running,
47  ResettingTask,
48  ResettingDevice,
49  Exiting
50  };
51 
52  enum class StateTransition : int // transition event between States
53  {
54  InitDevice,
55  InitTask,
56  Run,
57  Stop,
58  ResetTask,
59  ResetDevice,
60  End,
61  ErrorFound,
62  Automatic
63  };
64 
69  static auto ToState(const std::string& state) -> State { return fkStateStrMap.at(state); }
70 
75  static auto ToStateTransition(const std::string& transition) -> StateTransition { return fkStateTransitionStrMap.at(transition); }
76 
80  static auto ToStr(State state) -> std::string { return fkStrStateMap.at(state); }
81 
85  static auto ToStr(StateTransition transition) -> std::string { return fkStrStateTransitionMap.at(transition); }
86 
87  friend auto operator<<(std::ostream& os, const State& state) -> std::ostream& { return os << ToStr(state); }
88  friend auto operator<<(std::ostream& os, const StateTransition& transition) -> std::ostream& { return os << ToStr(transition); }
89 
90  StateMachine();
91 
92  struct IllegalTransition : std::runtime_error { using std::runtime_error::runtime_error; };
93 
94  struct StateChange : Event<State> {};
95  struct StateQueued : Event<State> {};
96  auto SubscribeToStateChange(const std::string& subscriber, std::function<void(typename StateChange::KeyType newState, State lastState)> callback) -> void { fCallbacks.Subscribe<StateChange, State>(subscriber, callback); }
97  auto UnsubscribeFromStateChange(const std::string& subscriber) -> void { fCallbacks.Unsubscribe<StateChange, State>(subscriber); }
98  auto SubscribeToStateQueued(const std::string& subscriber, std::function<void(typename StateQueued::KeyType newState, State lastState)> callback) -> void { fCallbacks.Subscribe<StateQueued, State>(subscriber, callback); }
99  auto UnsubscribeFromStateQueued(const std::string& subscriber) -> void { fCallbacks.Unsubscribe<StateQueued, State>(subscriber); }
100 
101  auto GetCurrentState() const -> State { std::lock_guard<std::mutex> lock{fMutex}; return fState; }
102  auto GetCurrentErrorState() const -> State { std::lock_guard<std::mutex> lock{fMutex}; return fErrorState; }
103  auto GetLastQueuedState() const -> State { std::lock_guard<std::mutex> lock{fMutex}; return fNextStates.back(); }
104 
105  auto ChangeState(StateTransition transition) -> void;
106 
107  auto Run() -> void;
108  auto Reset() -> void;
109 
110  auto NextStatePending() -> bool;
111 
112  private:
113  State fState;
114  State fErrorState;
115  std::deque<State> fNextStates;
116  EventManager fCallbacks;
117 
118  static const std::unordered_map<std::string, State> fkStateStrMap;
119  static const std::unordered_map<State, std::string, tools::HashEnum<State>> fkStrStateMap;
120  static const std::unordered_map<std::string, StateTransition> fkStateTransitionStrMap;
121  static const std::unordered_map<StateTransition, std::string, tools::HashEnum<StateTransition>> fkStrStateTransitionMap;
122 
123  mutable std::mutex fMutex;
124  std::condition_variable fNewState;
125 
126  static auto Transition(const State currentState, const StateTransition transition) -> State;
127 }; /* class StateMachine */
128 
129 } /* namespace mq */
130 } /* namespace fair */
131 
132 #endif /* FAIR_MQ_STATEMACHINE_H */
Definition: StateMachine.h:95
static auto ToStr(State state) -> std::string
Convert State to string.
Definition: StateMachine.h:80
static auto ToStateTransition(const std::string &transition) -> StateTransition
Convert string to StateTransition.
Definition: StateMachine.h:75
Definition: EventManager.h:33
Definition: StateMachine.h:92
static auto ToState(const std::string &state) -> State
Convert string to State.
Definition: StateMachine.h:69
Definition: StateMachine.h:94
static auto ToStr(StateTransition transition) -> std::string
Convert StateTransition to string.
Definition: StateMachine.h:85
Implements the state machine for FairMQ devices.
Definition: StateMachine.h:34
Tools for interfacing containers to the transport via polymorphic allocators.
Definition: DeviceRunner.h:23

privacy