X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/157b17ef4d7aa7d34625418c27861f3f139010bd..d34fd82d9f988a857f4f68c546400dc6637dcc41:/src/mc/mc_state.cpp diff --git a/src/mc/mc_state.cpp b/src/mc/mc_state.cpp index 154511c32a..9871c79be6 100644 --- a/src/mc/mc_state.cpp +++ b/src/mc/mc_state.cpp @@ -18,12 +18,15 @@ using api = simgrid::mc::Api; namespace simgrid { namespace mc { -State::State(unsigned long state_number) : num_(state_number) +long State::expended_states_ = 0; + +State::State() : num_(++expended_states_) { const unsigned long maxpid = api::get().get_maxpid(); actor_states_.resize(maxpid); + transition_.reset(new Transition()); /* Stateful model checking */ - if ((_sg_mc_checkpoint > 0 && (state_number % _sg_mc_checkpoint == 0)) || _sg_mc_termination) { + if ((_sg_mc_checkpoint > 0 && (num_ % _sg_mc_checkpoint == 0)) || _sg_mc_termination) { auto snapshot_ptr = api::get().take_snapshot(num_); system_state_ = std::shared_ptr(snapshot_ptr); if (_sg_mc_comms_determinism || _sg_mc_send_determinism) { @@ -38,9 +41,9 @@ std::size_t State::count_todo() const return boost::range::count_if(this->actor_states_, [](simgrid::mc::ActorState const& a) { return a.is_todo(); }); } -Transition State::get_transition() const +Transition* State::get_transition() const { - return this->transition_; + return transition_.get(); } int State::next_transition() const @@ -59,6 +62,37 @@ int State::next_transition() const } return -1; } +Transition* State::execute_next(int next) +{ + std::vector& actors = mc_model_checker->get_remote_process().actors(); + + kernel::actor::ActorImpl* actor = actors[next].copy.get_buffer(); + aid_t aid = actor->get_pid(); + int times_considered; + + simgrid::mc::ActorState* actor_state = &actor_states_[aid]; + /* This actor is ready to be executed. Prepare its execution when simcall_handle will be called on it */ + if (actor->simcall_.observer_ != nullptr) { + times_considered = actor_state->get_times_considered_and_inc(); + if (actor->simcall_.mc_max_consider_ <= actor_state->get_times_considered()) + actor_state->set_done(); + } else { + times_considered = 0; + actor_state->set_done(); + } + + transition_->init(aid, times_considered); + executed_req_ = actor->simcall_; + + XBT_DEBUG("Let's run actor %ld, going for transition %s", aid, transition_->to_cstring()); + + Transition::executed_transitions_++; + + Transition* res = mc_model_checker->handle_simcall(*transition_, true); + mc_model_checker->wait_for_requests(); + + return res; +} void State::copy_incomplete_comm_pattern() {