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
Make mc::Api::get_actor_name return a const&.
[simgrid.git]
/
src
/
mc
/
ModelChecker.cpp
diff --git
a/src/mc/ModelChecker.cpp
b/src/mc/ModelChecker.cpp
index 102133f86bc994b6058bc0e687c6e40bdeb2a9f0..3a9fb8513f62d3c66604ed3426677341f93274b0 100644
(file)
--- a/
src/mc/ModelChecker.cpp
+++ b/
src/mc/ModelChecker.cpp
@@
-105,11
+105,12
@@
void ModelChecker::shutdown()
{
XBT_DEBUG("Shutting down model-checker");
- RemoteProcess
* process = &this->
get_remote_process();
- if (process
->
running()) {
+ RemoteProcess
& process =
get_remote_process();
+ if (process
.
running()) {
XBT_DEBUG("Killing process");
- kill(process->pid(), SIGKILL);
- process->terminate();
+ finalize_app(true);
+ kill(process.pid(), SIGKILL);
+ process.terminate();
}
}
@@
-240,9
+241,7
@@
bool ModelChecker::handle_message(const char* buffer, ssize_t size)
/** Terminate the model-checker application */
void ModelChecker::exit(int status)
{
- // TODO, terminate the model checker politely instead of exiting rudely
- if (get_remote_process().running())
- kill(get_remote_process().pid(), SIGKILL);
+ shutdown();
::exit(status);
}
@@
-267,10
+266,11
@@
void ModelChecker::handle_waitpid()
// From PTRACE_O_TRACEEXIT:
#ifdef __linux__
if (status>>8 == (SIGTRAP | (PTRACE_EVENT_EXIT<<8))) {
-
int
ptrace_res = ptrace(PTRACE_GETEVENTMSG, remote_process_->pid(), 0, &status);
+
long
ptrace_res = ptrace(PTRACE_GETEVENTMSG, remote_process_->pid(), 0, &status);
xbt_assert(ptrace_res != -1, "Could not get exit status");
if (WIFSIGNALED(status)) {
MC_report_crash(status);
+ this->get_remote_process().terminate();
this->exit(SIMGRID_MC_EXIT_PROGRAM_CRASH);
}
}
@@
-290,6
+290,7
@@
void ModelChecker::handle_waitpid()
else if (WIFSIGNALED(status)) {
MC_report_crash(status);
+ this->get_remote_process().terminate();
this->exit(SIMGRID_MC_EXIT_PROGRAM_CRASH);
} else if (WIFEXITED(status)) {
XBT_DEBUG("Child process is over");
@@
-311,7
+312,7
@@
void ModelChecker::handle_simcall(Transition const& transition)
s_mc_message_simcall_handle_t m;
memset(&m, 0, sizeof(m));
m.type = MessageType::SIMCALL_HANDLE;
- m.
pid_ = transition.p
id_;
+ m.
aid_ = transition.a
id_;
m.times_considered_ = transition.times_considered_;
checker_side_.get_channel().send(m);
this->remote_process_->clear_cache();
@@
-380,12
+381,17
@@
std::string ModelChecker::simcall_dot_label(int aid, int times_considered)
return answer;
}
-void ModelChecker::finalize_app()
+void ModelChecker::finalize_app(
bool terminate_asap
)
{
- int res = checker_side_.get_channel().send(MessageType::FINALIZE);
- xbt_assert(res == 0, "Could not ask the app to finalize MPI on need");
- s_mc_message_int_t message;
- ssize_t s = checker_side_.get_channel().receive(message);
+ s_mc_message_int_t m;
+ memset(&m, 0, sizeof m);
+ m.type = MessageType::FINALIZE;
+ m.value = terminate_asap;
+ int res = checker_side_.get_channel().send(m);
+ xbt_assert(res == 0, "Could not ask the app to finalize on need");
+
+ s_mc_message_t answer;
+ ssize_t s = checker_side_.get_channel().receive(answer);
xbt_assert(s != -1, "Could not receive answer to FINALIZE");
}