Kea  2.3.5-git
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 
12 #include <exceptions/exceptions.h>
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 
20 namespace isc {
21 namespace util {
22 
25 public:
26  StateModelError(const char* file, size_t line, const char* what) :
27  isc::Exception(file, line, what) { };
28 };
29 
32 
35 
37 typedef std::function<void()> StateHandler;
38 
49 };
50 
61 class State : public LabeledValue {
62 public:
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 
98 private:
100  StateHandler handler_;
101 
103  StatePausing pausing_;
104 
107  bool was_paused_;
108 };
109 
111 typedef boost::shared_ptr<State> StatePtr;
112 
118 class StateSet : public LabeledValueSet {
119 public:
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 
274 class StateModel {
275 public:
276 
278  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  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 
369 protected:
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 
620 public:
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 
719 protected:
720 
730  const StatePtr getStateInternal(unsigned int value);
731 
732 private:
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 
846 typedef boost::shared_ptr<StateModel> StateModelPtr;
847 
848 } // namespace isc::util
849 } // namespace isc
850 #endif
This file defines classes: LabeledValue and LabeledValueSet.
StatePausing
State machine pausing modes.
Definition: state_model.h:45
Implements a finite state machine.
Definition: state_model.h:274
std::function< void()> StateHandler
Defines a pointer to an instance method for handling a state.
Definition: state_model.h:37
StateModelError(const char *file, size_t line, const char *what)
Definition: state_model.h:26
LabeledValuePtr EventPtr
Define Event pointer.
Definition: state_model.h:34
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
boost::shared_ptr< StateModel > StateModelPtr
Defines a pointer to a StateModel.
Definition: state_model.h:846
boost::shared_ptr< State > StatePtr
Defines a shared pointer to a State.
Definition: state_model.h:111
boost::shared_ptr< LabeledValue > LabeledValuePtr
Defines a shared pointer to a LabeledValue instance.
Definition: labeled_value.h:92
Implements the concept of a constant value with a text label.
Definition: labeled_value.h:39
LabeledValue Event
Define an Event.
Definition: state_model.h:31
Defines a State within the State Model.
Definition: state_model.h:61
This is a base class for exceptions thrown from the DNS library module.
Defines the logger used by the top-level component of kea-lfc.
Implements a set of unique LabeledValues.
Implements a unique set or dictionary of states.
Definition: state_model.h:118
Thrown if the state machine encounters a general error.
Definition: state_model.h:24