A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
[mc] Add documentation and fix some things
[simgrid.git]
/
src
/
mc
/
SafetyChecker.cpp
diff --git
a/src/mc/SafetyChecker.cpp
b/src/mc/SafetyChecker.cpp
index
e59dd97
..
285330b
100644
(file)
--- a/
src/mc/SafetyChecker.cpp
+++ b/
src/mc/SafetyChecker.cpp
@@
-91,8
+91,8
@@
void SafetyChecker::logState() // override
{
Checker::logState();
XBT_INFO("Expanded states = %lu", expandedStatesCount_);
- XBT_INFO("Visited states = %lu", mc_
stats
->visited_states);
- XBT_INFO("Executed transitions = %lu", mc_
stats
->executed_transitions);
+ XBT_INFO("Visited states = %lu", mc_
model_checker
->visited_states);
+ XBT_INFO("Executed transitions = %lu", mc_
model_checker
->executed_transitions);
}
int SafetyChecker::run()
@@
-110,7
+110,7
@@
int SafetyChecker::run()
stack_.size(), state, state->num,
state->interleaveSize());
- mc_
stats
->visited_states++;
+ mc_
model_checker
->visited_states++;
// The interleave set is empty or the maximum depth is reached,
// let's back-track.
@@
-135,7
+135,7
@@
int SafetyChecker::run()
if (dot_output != nullptr)
req_str = simgrid::mc::request_get_dot_output(req, state->transition.argument);
- mc_
stats
->executed_transitions++;
+ mc_
model_checker
->executed_transitions++;
/* Answer the request */
this->getSession().execute(state->transition);
@@
-154,8
+154,8
@@
int SafetyChecker::run()
/* Get an enabled process and insert it in the interleave set of the next state */
for (auto& p : mc_model_checker->process().simix_processes())
- if (simgrid::mc::process_is_enabled(
&p.copy
)) {
- next_state->interleave(
&p.copy
);
+ if (simgrid::mc::process_is_enabled(
p.copy.getBuffer()
)) {
+ next_state->interleave(
p.copy.getBuffer()
);
if (reductionMode_ != simgrid::mc::ReductionMode::none)
break;
}
@@
-174,7
+174,6
@@
int SafetyChecker::run()
XBT_INFO("No property violation found.");
simgrid::mc::session->logState();
- initial_global_state = nullptr;
return SIMGRID_MC_EXIT_SUCCESS;
}
@@
-269,7
+268,7
@@
int SafetyChecker::backtrack()
XBT_DEBUG("Back-tracking to state %d at depth %zi",
state->num, stack_.size() + 1);
stack_.push_back(std::move(state));
-
simgrid::mc::replay(stack_
);
+
this->restoreState(
);
XBT_DEBUG("Back-tracking to state %d at depth %zi done",
stack_.back()->num, stack_.size());
break;
@@
-281,6
+280,31
@@
int SafetyChecker::backtrack()
return SIMGRID_MC_EXIT_SUCCESS;
}
+void SafetyChecker::restoreState()
+{
+ /* Intermediate backtracking */
+ {
+ simgrid::mc::State* state = stack_.back().get();
+ if (state->system_state) {
+ simgrid::mc::restore_snapshot(state->system_state);
+ return;
+ }
+ }
+
+ /* Restore the initial state */
+ simgrid::mc::session->restoreInitialState();
+
+ /* Traverse the stack from the state at position start and re-execute the transitions */
+ for (std::unique_ptr<simgrid::mc::State> const& state : stack_) {
+ if (state == stack_.back())
+ break;
+ session->execute(state->transition);
+ /* Update statistics */
+ mc_model_checker->visited_states++;
+ mc_model_checker->executed_transitions++;
+ }
+}
+
void SafetyChecker::init()
{
reductionMode_ = simgrid::mc::reduction_mode;
@@
-293,7
+317,7
@@
void SafetyChecker::init()
XBT_INFO("Check non progressive cycles");
else
XBT_INFO("Check a safety property");
-
mc_model_checker->wait_for_requests
();
+
simgrid::mc::session->initialize
();
XBT_DEBUG("Starting the safety algorithm");
@@
-305,17
+329,13
@@
void SafetyChecker::init()
/* Get an enabled process and insert it in the interleave set of the initial state */
for (auto& p : mc_model_checker->process().simix_processes())
- if (simgrid::mc::process_is_enabled(
&p.copy
)) {
- initial_state->interleave(
&p.copy
);
+ if (simgrid::mc::process_is_enabled(
p.copy.getBuffer()
)) {
+ initial_state->interleave(
p.copy.getBuffer()
);
if (reductionMode_ != simgrid::mc::ReductionMode::none)
break;
}
stack_.push_back(std::move(initial_state));
-
- /* Save the initial state */
- initial_global_state = std::unique_ptr<s_mc_global_t>(new s_mc_global_t());
- initial_global_state->snapshot = simgrid::mc::take_snapshot(0);
}
SafetyChecker::SafetyChecker(Session& session) : Checker(session)