X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ab209b5fb2592a3287497a9ea08773471005192f..6cecccd687a1340319b003a760f3538eab5f6915:/src/mc/api/ActorState.hpp diff --git a/src/mc/api/ActorState.hpp b/src/mc/api/ActorState.hpp index d0752d25a9..eda280894b 100644 --- a/src/mc/api/ActorState.hpp +++ b/src/mc/api/ActorState.hpp @@ -26,10 +26,25 @@ namespace simgrid::mc { * is important in cases */ class ActorState { - /** * @brief The transitions that the actor is allowed to execute from this - * state. + * state, viz. those that are enabled for this actor + * + * Most actors can take only a single action from any given state. + * However, when an actor executes a transition with multiple + * possible variations (e.g. an MC_Random() [see class: RandomTransition] + * for more details]), multiple enabled actions are defined + * + * @invariant The transitions are arranged such that an actor + * with multiple possible paths of execution will contain all + * such transitions such that `pending_transitions_[i]` represents + * the variation of the transition with `times_considered = i`. + * + * TODO: If only a subset of transitions of an actor that can + * take multiple transitions in some state are truly enabled, + * we would instead need to map `times_considered` to a transition, + * as the map is currently implicit in the ordering of the transitions + * in the vector * * TODO: If a single transition is taken at a time in a concurrent system, * then nearly all of the transitions from in a state `s'` after taking @@ -38,7 +53,7 @@ class ActorState { * This means there may be a way to store the list once and apply differences * rather than repeating elements frequently. */ - std::vector> pending_transitions_; + std::vector> pending_transitions_; /* Possible exploration status of an actor transition in a state. * Either the checker did not consider the transition, or it was considered and still to do, or considered and @@ -71,15 +86,15 @@ class ActorState { public: ActorState(aid_t aid, bool enabled, unsigned int max_consider) : ActorState(aid, enabled, max_consider, {}) {} - ActorState(aid_t aid, bool enabled, unsigned int max_consider, std::vector> transitions) - : aid_(aid), max_consider_(max_consider), enabled_(enabled), pending_transitions_(std::move(transitions)) + ActorState(aid_t aid, bool enabled, unsigned int max_consider, std::vector> transitions) + : pending_transitions_(std::move(transitions)), aid_(aid), max_consider_(max_consider), enabled_(enabled) { } unsigned int do_consider() { if (max_consider_ <= times_considered_ + 1) - set_done(); + mark_done(); return times_considered_++; } unsigned int get_times_considered() const { return times_considered_; } @@ -97,16 +112,25 @@ public: this->state_ = InterleavingType::todo; this->times_considered_ = 0; } - void set_done() { this->state_ = InterleavingType::done; } + void mark_done() { this->state_ = InterleavingType::done; } - Transition* get_transition(unsigned times_considered) + inline Transition* get_transition(unsigned times_considered) { - xbt_assert(times_considered <= this->pending_transitions_.size(), - "Actor %lu does not have a state available transition with `times_considered = %d`,\n" + xbt_assert(times_considered < this->pending_transitions_.size(), + "Actor %ld does not have a state available transition with `times_considered = %u`,\n" "yet one was asked for", aid_, times_considered); return this->pending_transitions_[times_considered].get(); } + + inline void set_transition(std::unique_ptr t, unsigned times_considered) + { + xbt_assert(times_considered < this->pending_transitions_.size(), + "Actor %ld does not have a state available transition with `times_considered = %u`, " + "yet one was attempted to be set", + aid_, times_considered); + this->pending_transitions_[times_considered] = std::move(t); + } }; } // namespace simgrid::mc