X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1aaf3e3fc120f9434c692f1c49d03a00b24e55a1..9b60e270c5fe98fb6c528164aa9c6e4e6045f7e0:/include/simgrid/kernel/resource/Action.hpp diff --git a/include/simgrid/kernel/resource/Action.hpp b/include/simgrid/kernel/resource/Action.hpp index 4961cef1d9..9ed8456001 100644 --- a/include/simgrid/kernel/resource/Action.hpp +++ b/include/simgrid/kernel/resource/Action.hpp @@ -13,7 +13,7 @@ #include #include -const int NO_MAX_DURATION = -1.0; +static constexpr int NO_MAX_DURATION = -1.0; namespace simgrid { namespace kernel { @@ -24,8 +24,34 @@ typedef boost::heap::pairing_heap>> heap_type; -/** @details An action is a consumption on a resource (e.g.: a communication for the network) */ +typedef std::pair heap_element_type; +class XBT_PUBLIC ActionHeap : public heap_type { + friend Action; + +public: + enum class Type { + latency = 100, /* this is a heap entry to warn us when the latency is payed */ + max_duration, /* this is a heap entry to warn us when the max_duration limit (timeout) is reached */ + normal, /* this is a normal heap entry stating the date to finish transmitting */ + unset + }; + + double top_date() const; + void insert(Action* action, double date, ActionHeap::Type type); + void update(Action* action, double date, ActionHeap::Type type); + void remove(Action* action); + Action* pop(); + bool empty() const { return heap_type::empty(); } +}; + +/** @details An action is a consumption on a resource (e.g.: a communication for the network). + * + * It is related (but still different) from activities, that are the stuff on which an actor can be blocked. + * See simgrid::s4u::Activity for more details. + */ class XBT_PUBLIC Action { + friend ActionHeap; + public: /* Lazy update needs this Set hook to maintain a list of the tracked actions */ boost::intrusive::list_member_hook<> modified_set_hook_; @@ -40,12 +66,12 @@ public: StateSet; enum class State { - ready = 0, /**< Ready */ - running, /**< Running */ - failed, /**< Task Failure */ - done, /**< Completed */ - to_free, /**< Action to free in next cleanup */ - not_in_the_system /**< Not in the system anymore. Why did you ask ? */ + INITED, /**< Created, but not started yet */ + STARTED, /**< Currently running */ + FAILED, /**< either the resource failed, or the action was canceled */ + FINISHED, /**< Successfully completed */ + IGNORED /**< e.g. failure detectors: infinite sleep actions that are put on resources which failure should get + noticed */ }; enum class SuspendStates { @@ -54,8 +80,6 @@ public: sleeping }; - enum class Type { LATENCY = 100, MAX_DURATION, NORMAL, NOTSET }; - /** * @brief Action constructor * @@ -134,7 +158,7 @@ public: void ref(); /** @brief Unref that action (and destroy it if refcount reaches 0) * @return true if the action was destroyed and false if someone still has references on it */ - int unref(); + bool unref(); /** @brief Cancel the current Action if running */ virtual void cancel(); @@ -189,14 +213,12 @@ private: double last_update_ = 0; double last_value_ = 0; kernel::lmm::Variable* variable_ = nullptr; - Action::Type type_ = Action::Type::NOTSET; - boost::optional heap_hook_ = boost::none; + + ActionHeap::Type type_ = ActionHeap::Type::unset; + boost::optional heap_hook_ = boost::none; public: - void heapInsert(double key, Action::Type hat); - void heapRemove(); - void heapUpdate(double key, Action::Type hat); - void clearHeapHandle() { heap_hook_ = boost::none; } + ActionHeap::Type get_type() const { return type_; } lmm::Variable* get_variable() const { return variable_; } void set_variable(lmm::Variable* var) { variable_ = var; } @@ -207,8 +229,6 @@ public: double get_last_value() const { return last_value_; } void set_last_value(double val) { last_value_ = val; } - Action::Type get_type() const { return type_; } - protected: Action::SuspendStates suspended_ = Action::SuspendStates::not_suspended; };