Kea 2.7.1
state_model.h
Go to the documentation of this file.
1// Copyright (C) 2013-2021 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef STATE_MODEL_H
8#define STATE_MODEL_H
9
11
13#include <util/labeled_value.h>
14#include <boost/shared_ptr.hpp>
15#include <functional>
16#include <map>
17#include <mutex>
18#include <string>
19
20namespace isc {
21namespace util {
22
25public:
26 StateModelError(const char* file, size_t line, const char* what) :
27 isc::Exception(file, line, what) { };
28};
29
32
35
37typedef std::function<void()> StateHandler;
38
50
61class State : public LabeledValue {
62public:
80 State(const int value, const std::string& label, StateHandler handler,
81 const StatePausing& state_pausing = STATE_PAUSE_NEVER);
82
84 virtual ~State();
85
87 void run();
88
96 bool shouldPause();
97
98private:
100 StateHandler handler_;
101
103 StatePausing pausing_;
104
107 bool was_paused_;
108};
109
111typedef boost::shared_ptr<State> StatePtr;
112
118class StateSet : public LabeledValueSet {
119public:
121 StateSet();
122
124 virtual ~StateSet();
125
135 void add(const int value, const std::string& label, StateHandler handler,
136 const StatePausing& state_pausing);
137
146 const StatePtr getState(int value);
147};
148
226
275public:
276
278
279 static const int NEW_ST = 0;
280
282 static const int END_ST = 1;
283
285 static const int SM_DERIVED_STATE_MIN = 11;
287
289
292 static const int NOP_EVT = 0;
293
295 static const int START_EVT = 1;
296
298 static const int END_EVT = 2;
299
301 static const int FAIL_EVT = 3;
302
304 static const int SM_DERIVED_EVENT_MIN = 11;
306
308 StateModel();
309
311 virtual ~StateModel();
312
324 void startModel(const int start_state);
325
348 virtual void runModel(unsigned int event);
349
357 void endModel();
358
360 void unpauseModel();
361
367 void nopStateHandler();
368
369protected:
370
379 void initDictionaries();
380
405 virtual void defineEvents();
406
417 void defineEvent(unsigned int value, const std::string& label);
418
428 const EventPtr& getEvent(unsigned int value);
429
456 virtual void verifyEvents();
457
482 virtual void defineStates();
483
498 void defineState(unsigned int value, const std::string& label,
499 StateHandler handler,
500 const StatePausing& state_pausing = STATE_PAUSE_NEVER);
501
509 const StatePtr getState(unsigned int value);
510
536 virtual void verifyStates();
537
548 virtual void onModelFailure(const std::string& explanation);
549
561 void transition(unsigned int state, unsigned int event);
562
572 void abortModel(const std::string& explanation);
573
585 void setState(unsigned int state);
586
596 void postNextEvent(unsigned int event);
597
607 bool doOnEntry();
608
618 bool doOnExit();
619
620public:
621
629 unsigned int getCurrState() const;
630
634 unsigned int getPrevState() const;
635
639 unsigned int getLastEvent() const;
640
648 unsigned int getNextEvent() const;
649
653 bool isModelNew() const;
654
659 bool isModelRunning() const;
660
665 bool isModelWaiting() const;
666
670 bool isModelDone() const;
671
675 bool isModelPaused() const;
676
681 bool didModelFail() const;
682
689 std::string getEventLabel(const int event) const;
690
697 std::string getStateLabel(const int state) const;
698
707 std::string getContextStr() const;
708
717 std::string getPrevContextStr() const;
718
719protected:
720
730 const StatePtr getStateInternal(unsigned int value);
731
732private:
733
746 void setStateInternal(unsigned int state);
747
758 void postNextEventInternal(unsigned int event);
759
765 bool isModelNewInternal() const;
766
775 std::string getEventLabelInternal(const int event) const;
776
785 std::string getStateLabelInternal(const int state) const;
786
797 std::string getContextStrInternal() const;
798
809 std::string getPrevContextStrInternal() const;
810
812 LabeledValueSet events_;
813
815 StateSet states_;
816
818 bool dictionaries_initted_;
819
821 unsigned int curr_state_;
822
824 unsigned int prev_state_;
825
827 unsigned int last_event_;
828
830 unsigned int next_event_;
831
833 bool on_entry_flag_;
834
836 bool on_exit_flag_;
837
839 bool paused_;
840
842 boost::shared_ptr<std::mutex> mutex_;
843};
844
846typedef boost::shared_ptr<StateModel> StateModelPtr;
847
848} // namespace isc::util
849} // namespace isc
850#endif
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
Implements a set of unique LabeledValues.
Implements the concept of a constant value with a text label.
Thrown if the state machine encounters a general error.
Definition state_model.h:24
StateModelError(const char *file, size_t line, const char *what)
Definition state_model.h:26
Implements a finite state machine.
const EventPtr & getEvent(unsigned int value)
Fetches the event referred to by value.
bool isModelWaiting() const
Returns whether or not the model is waiting.
void initDictionaries()
Initializes the event and state dictionaries.
void endModel()
Conducts a normal transition to the end of the model.
static const int SM_DERIVED_STATE_MIN
Value at which custom states in a derived class should begin.
std::string getStateLabel(const int state) const
Fetches the label associated with an state value.
void unpauseModel()
Unpauses state model.
static const int FAIL_EVT
Event issued to abort the model execution.
bool isModelDone() const
Returns whether or not the model has finished execution.
virtual void runModel(unsigned int event)
Processes events through the state model.
bool isModelPaused() const
Returns whether or not the model is paused.
virtual void defineEvents()
Populates the set of events.
void postNextEvent(unsigned int event)
Sets the next event to the given event value.
virtual void verifyStates()
Validates the contents of the set of states.
void defineState(unsigned int value, const std::string &label, StateHandler handler, const StatePausing &state_pausing=STATE_PAUSE_NEVER)
Adds an state value and associated label to the set of states.
const StatePtr getState(unsigned int value)
Fetches the state referred to by value.
bool isModelRunning() const
Returns whether or not the model is running.
bool doOnExit()
Checks if on exit flag is true.
StateModel()
Constructor.
static const int NEW_ST
State that a state model is in immediately after construction.
unsigned int getNextEvent() const
Fetches the model's next event.
void nopStateHandler()
An empty state handler.
virtual void onModelFailure(const std::string &explanation)
Handler for fatal model execution errors.
void defineEvent(unsigned int value, const std::string &label)
Adds an event value and associated label to the set of events.
void transition(unsigned int state, unsigned int event)
Sets up the model to transition into given state with a given event.
virtual void verifyEvents()
Validates the contents of the set of events.
static const int END_EVT
Event issued to end the model execution.
bool doOnEntry()
Checks if on entry flag is true.
static const int NOP_EVT
Signifies that no event has occurred.
static const int START_EVT
Event issued to start the model execution.
void abortModel(const std::string &explanation)
Aborts model execution.
std::string getEventLabel(const int event) const
Fetches the label associated with an event value.
bool isModelNew() const
Returns whether or not the model is new.
void startModel(const int start_state)
Begins execution of the model.
virtual void defineStates()
Populates the set of states.
const StatePtr getStateInternal(unsigned int value)
Fetches the state referred to by value.
std::string getPrevContextStr() const
Convenience method which returns a string rendition of the previous state and last event.
virtual ~StateModel()
Destructor.
void setState(unsigned int state)
Sets the current state to the given state value.
std::string getContextStr() const
Convenience method which returns a string rendition of the current state and next event.
static const int SM_DERIVED_EVENT_MIN
Value at which custom events in a derived class should begin.
static const int END_ST
Final state, all the state model has reached its conclusion.
unsigned int getLastEvent() const
Fetches the model's last event.
unsigned int getPrevState() const
Fetches the model's previous state.
bool didModelFail() const
Returns whether or not the model failed.
unsigned int getCurrState() const
Fetches the model's current state.
Implements a unique set or dictionary of states.
const StatePtr getState(int value)
Fetches a state for the given value.
StateSet()
Constructor.
void add(const int value, const std::string &label, StateHandler handler, const StatePausing &state_pausing)
Adds a state definition to the set of states.
virtual ~StateSet()
Destructor.
Defines a State within the State Model.
Definition state_model.h:61
virtual ~State()
Destructor.
void run()
Invokes the State's handler.
bool shouldPause()
Indicates if the state model should pause upon entering this state.
State(const int value, const std::string &label, StateHandler handler, const StatePausing &state_pausing=STATE_PAUSE_NEVER)
Constructor.
This file defines classes: LabeledValue and LabeledValueSet.
LabeledValue Event
Define an Event.
Definition state_model.h:31
std::function< void()> StateHandler
Defines a pointer to an instance method for handling a state.
Definition state_model.h:37
boost::shared_ptr< StateModel > StateModelPtr
Defines a pointer to a StateModel.
StatePausing
State machine pausing modes.
Definition state_model.h:45
@ STATE_PAUSE_ALWAYS
Definition state_model.h:46
@ STATE_PAUSE_ONCE
Definition state_model.h:48
@ STATE_PAUSE_NEVER
Definition state_model.h:47
boost::shared_ptr< State > StatePtr
Defines a shared pointer to a State.
LabeledValuePtr EventPtr
Define Event pointer.
Definition state_model.h:34
boost::shared_ptr< LabeledValue > LabeledValuePtr
Defines a shared pointer to a LabeledValue instance.
Defines the logger used by the top-level component of kea-lfc.