-/* Copyright (c) 2011-2021. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2011-2022. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "src/mc/checker/LivenessChecker.hpp"
+#include "src/mc/Session.hpp"
#include "src/mc/mc_config.hpp"
#include "src/mc/mc_exit.hpp"
#include "src/mc/mc_private.hpp"
-#include "src/mc/mc_request.hpp"
#include <boost/range/algorithm.hpp>
#include <cstring>
if (this->graph_state->system_state_ == nullptr)
this->graph_state->system_state_ = std::make_shared<Snapshot>(pair_num);
this->heap_bytes_used = api::get().get_remote_heap_bytes();
- this->actors_count = api::get().get_actors_size();
+ this->actors_count = api::get().get_actors().size();
this->other_num = -1;
this->atomic_propositions = std::move(atomic_propositions);
}
&& evaluate_label(l->u.or_and.right_exp, values);
case xbt_automaton_exp_label::AUT_NOT:
return not evaluate_label(l->u.exp_not, values);
- case xbt_automaton_exp_label::AUT_PREDICAT:{
- auto cursor = api::get().compare_automaton_exp_label(l);
- if(cursor >= 0)
- return values[cursor] != 0;
- xbt_die("Missing predicate");
- break;
- }
+ case xbt_automaton_exp_label::AUT_PREDICAT:
+ return values.at(api::get().compare_automaton_exp_label(l)) != 0;
case xbt_automaton_exp_label::AUT_ONE:
return true;
default:
std::shared_ptr<const std::vector<int>> LivenessChecker::get_proposition_values() const
{
- auto values = api::get().automaton_propositional_symbol_evaluate();
+ auto values = api::get().automaton_propositional_symbol_evaluate();
return std::make_shared<const std::vector<int>>(std::move(values));
}
}
}
- /* Restore the initial state */
- api::get().restore_initial_state();
+ get_session().restore_initial_state();
/* Traverse the stack from the initial state and re-execute the transitions */
int depth = 1;
std::shared_ptr<State> state = pair->graph_state;
if (pair->exploration_started) {
- int req_num = state->transition_.times_considered_;
- const s_smx_simcall* saved_req = &state->executed_req_;
-
- smx_simcall_t req = nullptr;
-
- /* because we got a copy of the executed request, we have to fetch the
- real one, pointed by the request field of the issuer process */
- const smx_actor_t issuer = api::get().simcall_get_issuer(saved_req);
- req = &issuer->simcall_;
-
- /* Debug information */
- XBT_DEBUG("Replay (depth = %d) : %s (%p)", depth, api::get().request_to_string(req, req_num).c_str(),
- state.get());
-
- api::get().execute(state->transition_, req);
+ state->get_transition()->replay();
+ XBT_DEBUG("Replay (depth = %d) : %s (%p)", depth, state->get_transition()->to_string().c_str(), state.get());
}
/* Update statistics */
visited_pairs_count_++;
- api::get().mc_inc_executed_trans();
-
depth++;
}
XBT_DEBUG("**** End Replay ****");
{
XBT_INFO("Expanded pairs = %lu", expanded_pairs_count_);
XBT_INFO("Visited pairs = %lu", visited_pairs_count_);
- XBT_INFO("Executed transitions = %lu", api::get().mc_get_executed_trans());
+ XBT_INFO("Executed transitions = %lu", Transition::get_executed_transitions());
}
void LivenessChecker::show_acceptance_cycle(std::size_t depth)
XBT_INFO("Counter-example that violates formula:");
for (auto const& s : this->get_textual_trace())
XBT_INFO(" %s", s.c_str());
- api::get().dump_record_path();
- api::get().log_state();
+ XBT_INFO("Path = %s", get_record_trace().to_string().c_str());
+ log_state();
XBT_INFO("Counter-example depth: %zu", depth);
}
std::vector<std::string> LivenessChecker::get_textual_trace() // override
{
std::vector<std::string> trace;
- for (std::shared_ptr<Pair> const& pair : exploration_stack_) {
- int req_num = pair->graph_state->transition_.times_considered_;
- smx_simcall_t req = &pair->graph_state->executed_req_;
- if (req->call_ != simix::Simcall::NONE)
- trace.push_back(api::get().request_to_string(req, req_num));
- }
+ for (std::shared_ptr<Pair> const& pair : exploration_stack_)
+ trace.push_back(pair->graph_state->get_transition()->to_string());
+
return trace;
}
std::shared_ptr<const std::vector<int>> propositions)
{
++expanded_pairs_count_;
- ++expanded_states_count_;
auto next_pair = std::make_shared<Pair>(expanded_pairs_count_);
next_pair->automaton_state = state;
- next_pair->graph_state = std::make_shared<State>(expanded_states_count_);
+ next_pair->graph_state = std::make_shared<State>();
next_pair->atomic_propositions = std::move(propositions);
if (current_pair)
next_pair->depth = current_pair->depth + 1;
else
next_pair->depth = 1;
- /* Get enabled actors and insert them in the interleave set of the next graph_state */
- auto actors = api::get().get_actors();
- for (auto& actor : actors)
- if (api::get().actor_is_enabled(actor.copy.get_buffer()->get_pid()))
- next_pair->graph_state->mark_todo(actor.copy.get_buffer());
+ /* Add all enabled actors to the interleave set of the initial state */
+ for (auto& act : api::get().get_actors()) {
+ auto actor = act.copy.get_buffer();
+ if (get_session().actor_is_enabled(actor->get_pid()))
+ next_pair->graph_state->mark_todo(actor->get_pid());
+ }
+
next_pair->requests = next_pair->graph_state->count_todo();
/* FIXME : get search_cycle value for each accepting state */
if (next_pair->automaton_state->type == 1 || (current_pair && current_pair->search_cycle))
api::get().automaton_load(_sg_mc_property_file.get().c_str());
XBT_DEBUG("Starting the liveness algorithm");
- api::get().session_initialize();
+ get_session().take_initial_snapshot();
/* Initialize */
this->previous_pair_ = 0;
}
}
- smx_simcall_t req = api::get().mc_state_choose_request(current_pair->graph_state.get());
- int req_num = current_pair->graph_state->transition_.times_considered_;
+ current_pair->graph_state->execute_next(current_pair->graph_state->next_transition());
+ XBT_DEBUG("Execute: %s", current_pair->graph_state->get_transition()->to_string().c_str());
if (dot_output != nullptr) {
if (this->previous_pair_ != 0 && this->previous_pair_ != current_pair->num) {
this->previous_request_.clear();
}
this->previous_pair_ = current_pair->num;
- this->previous_request_ = api::get().request_get_dot_output(req, req_num);
+ this->previous_request_ = current_pair->graph_state->get_transition()->dot_string();
if (current_pair->search_cycle)
fprintf(dot_output, "%d [shape=doublecircle];\n", current_pair->num);
fflush(dot_output);
}
- XBT_DEBUG("Execute: %s", api::get().request_to_string(req, req_num).c_str());
-
- /* Update stats */
- api::get().mc_inc_executed_trans();
-
if (not current_pair->exploration_started)
visited_pairs_count_++;
- /* Answer the request */
- api::get().handle_simcall(current_pair->graph_state->transition_);
-
- /* Wait for requests (schedules processes) */
- api::get().mc_wait_for_requests();
-
current_pair->requests--;
current_pair->exploration_started = true;
// For each enabled transition in the property automaton, push a
// (application_state, automaton_state) pair to the exploration stack:
- for (int i = api::get().get_dynar_length(current_pair->automaton_state->out) - 1; i >= 0; i--) {
+ for (int i = xbt_dynar_length(current_pair->automaton_state->out) - 1; i >= 0; i--) {
auto transition_succ_label = api::get().get_automaton_transition_label(current_pair->automaton_state->out, i);
- auto transition_succ_dst = api::get().get_automaton_transition_dst(current_pair->automaton_state->out, i);
+ auto transition_succ_dst = api::get().get_automaton_transition_dst(current_pair->automaton_state->out, i);
if (evaluate_label(transition_succ_label, *prop_values))
exploration_stack_.push_back(this->create_pair(current_pair.get(), transition_succ_dst, prop_values));
}
}
XBT_INFO("No property violation found.");
- api::get().log_state();
+ log_state();
}
-Checker* createLivenessChecker(Session* session)
+Checker* create_liveness_checker(Session* session)
{
return new LivenessChecker(session);
}