9 #ifndef FAIR_MQ_STATEMACHINE_H 10 #define FAIR_MQ_STATEMACHINE_H 13 #include <FairMQLogger.h> 14 #include <fairmq/Tools.h> 15 #include <fairmq/EventManager.h> 19 #include <condition_variable> 21 #include <unordered_map> 37 enum class State : int
52 enum class StateTransition : int
69 static auto ToState(
const std::string& state) -> State {
return fkStateStrMap.at(state); }
75 static auto ToStateTransition(
const std::string& transition) -> StateTransition {
return fkStateTransitionStrMap.at(transition); }
80 static auto ToStr(State state) -> std::string {
return fkStrStateMap.at(state); }
85 static auto ToStr(StateTransition transition) -> std::string {
return fkStrStateTransitionMap.at(transition); }
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); }
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); }
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(); }
105 auto ChangeState(StateTransition transition) -> void;
108 auto Reset() -> void;
110 auto NextStatePending() -> bool;
115 std::deque<State> fNextStates;
116 EventManager fCallbacks;
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;
123 mutable std::mutex fMutex;
124 std::condition_variable fNewState;
126 static auto Transition(
const State currentState,
const StateTransition transition) -> State;
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