-XBT_PUBLIC_CLASS Action {
-public:
- boost::intrusive::list_member_hook<> action_hook;
- boost::intrusive::list_member_hook<> action_lmm_hook;
- typedef boost::intrusive::member_hook<
- Action, boost::intrusive::list_member_hook<>, &Action::action_hook> ActionOptions;
- typedef boost::intrusive::list<Action, ActionOptions> ActionList;
-
- 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 ? */
- };
-
- /**
- * @brief Action constructor
- *
- * @param model The Model associated to this Action
- * @param cost The cost of the Action
- * @param failed If the action is impossible (e.g.: execute something on a switched off host)
- */
- Action(simgrid::surf::Model *model, double cost, bool failed);
-
- /**
- * @brief Action constructor
- *
- * @param model The Model associated to this Action
- * @param cost The cost of the Action
- * @param failed If the action is impossible (e.g.: execute something on a switched off host)
- * @param var The lmm variable associated to this Action if it is part of a LMM component
- */
- Action(simgrid::surf::Model *model, double cost, bool failed, lmm_variable_t var);
-
- /** @brief Destructor */
- virtual ~Action();
-
- /**
- * @brief Mark that the action is now finished
- *
- * @param state the new [state](\ref simgrid::surf::Action::State) of the current Action
- */
- void finish(Action::State state);
-
- /** @brief Get the [state](\ref simgrid::surf::Action::State) of the current Action */
- Action::State getState(); /**< get the state*/
- /** @brief Set the [state](\ref simgrid::surf::Action::State) of the current Action */
- virtual void setState(Action::State state);
-
- /** @brief Get the bound of the current Action */
- double getBound();
- /** @brief Set the bound of the current Action */
- void setBound(double bound);
-
- /** @brief Get the start time of the current action */
- double getStartTime();
- /** @brief Get the finish time of the current action */
- double getFinishTime();
-
- /** @brief Get the user data associated to the current action */
- void *getData() {return data_;}
- /** @brief Set the user data associated to the current action */
- void setData(void* data);
-
- /** @brief Get the cost of the current action */
- double getCost() {return cost_;}
- /** @brief Set the cost of the current action */
- void setCost(double cost) {cost_ = cost;}
-
- /** @brief Update the maximum duration of the current action
- * @param delta Amount to remove from the MaxDuration */
- void updateMaxDuration(double delta) {double_update(&maxDuration_, delta,sg_surf_precision);}
-
- /** @brief Update the remaining time of the current action
- * @param delta Amount to remove from the remaining time */
- void updateRemains(double delta) {double_update(&remains_, delta, sg_maxmin_precision*sg_surf_precision);}
-
- /** @brief Set the remaining time of the current action */
- void setRemains(double value) {remains_ = value;}
- /** @brief Get the remaining time of the current action after updating the resource */
- virtual double getRemains();
- /** @brief Get the remaining time of the current action without updating the resource */
- double getRemainsNoUpdate();
-
- /** @brief Set the finish time of the current action */
- void setFinishTime(double value) {finishTime_ = value;}
-
- /**@brief Add a reference to the current action (refcounting) */
- 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
- */
- virtual int unref();
-
- /** @brief Cancel the current Action if running */
- virtual void cancel();
-
- /** @brief Suspend the current Action */
- virtual void suspend();
-
- /** @brief Resume the current Action */
- virtual void resume();
-
- /** @brief Returns true if the current action is running */
- virtual bool isSuspended();
-
- /** @brief Get the maximum duration of the current action */
- double getMaxDuration() {return maxDuration_;}
- /** @brief Set the maximum duration of the current Action */
- virtual void setMaxDuration(double duration);
-
- /** @brief Get the tracing category associated to the current action */
- char *getCategory() {return category_;}
- /** @brief Set the tracing category of the current Action */
- void setCategory(const char *category);
-
- /** @brief Get the priority of the current Action */
- double getPriority() { return sharingWeight_; };
- /** @brief Set the priority of the current Action */
- virtual void setSharingWeight(double priority);
-
- /** @brief Get the state set in which the action is */
- ActionList* getStateSet() {return stateSet_;};
-
- s_xbt_swag_hookup_t stateHookup_ = {nullptr,nullptr};
-
- simgrid::surf::Model* getModel() { return model_; }
-
-protected:
- ActionList* stateSet_;
- double sharingWeight_ = 1.0; /**< priority (1.0 by default) */
- int refcount_ = 1;
- double remains_; /**< How much of that cost remains to be done in the currently running task */
- double maxDuration_ = NO_MAX_DURATION; /*< max_duration (may fluctuate until the task is completed) */
- double finishTime_ = -1; /**< finish time : this is modified during the run and fluctuates until the task is completed */
-
-private:
- double start_; /**< start time */
- char *category_ = nullptr; /**< tracing category for categorized resource utilization monitoring */
-
- double cost_;
- simgrid::surf::Model *model_;
- void *data_ = nullptr; /**< for your convenience */
-
- /* LMM */
-public:
- virtual void updateRemainingLazy(double now);
- void heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat);
- void heapRemove(xbt_heap_t heap);
- void heapUpdate(xbt_heap_t heap, double key, enum heap_action_type hat);
- virtual void updateIndexHeap(int i);
- lmm_variable_t getVariable() {return variable_;}
- double getLastUpdate() {return lastUpdate_;}
- void refreshLastUpdate() {lastUpdate_ = surf_get_clock();}
- enum heap_action_type getHat() {return hat_;}
- bool is_linked() {return action_lmm_hook.is_linked();}
-
-protected:
- lmm_variable_t variable_ = nullptr;
- double lastValue_ = 0;
- double lastUpdate_ = 0;
- int suspended_ = 0;
- int indexHeap_;
- enum heap_action_type hat_ = NOTSET;
-};
-
-typedef Action::ActionList ActionList;
-
-typedef boost::intrusive::member_hook<
- Action, boost::intrusive::list_member_hook<>, &Action::action_lmm_hook> ActionLmmOptions;
-typedef boost::intrusive::list<Action, ActionLmmOptions> ActionLmmList;
-typedef ActionLmmList* ActionLmmListPtr;
-
-/*********
- * Model *
- *********/
-
-/** @ingroup SURF_interface
- * @brief SURF model interface class
- * @details A model is an object which handle the interactions between its Resources and its Actions