-void ModelChecker::start()
-{
- checker_side_.start([](evutil_socket_t sig, short events, void* arg) {
- auto mc = static_cast<simgrid::mc::ModelChecker*>(arg);
- if (events == EV_READ) {
- std::array<char, MC_MESSAGE_LENGTH> buffer;
- ssize_t size = mc->checker_side_.get_channel().receive(buffer.data(), buffer.size(), false);
- if (size == -1 && errno != EAGAIN)
- throw simgrid::xbt::errno_error();
-
- if (not mc->handle_message(buffer.data(), size))
- mc->checker_side_.break_loop();
- } else if (events == EV_SIGNAL) {
- if (sig == SIGCHLD)
- mc->handle_waitpid();
- } else {
- xbt_die("Unexpected event");
- }
- });
-
- XBT_DEBUG("Waiting for the model-checked process");
- int status;
-
- // The model-checked process SIGSTOP itself to signal it's ready:
- const pid_t pid = remote_simulation_->pid();
-
- pid_t res = waitpid(pid, &status, WAITPID_CHECKED_FLAGS);
- if (res < 0 || not WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
- xbt_die("Could not wait model-checked process");
-
- remote_simulation_->init();
-
- if (not _sg_mc_dot_output_file.get().empty())
- MC_init_dot_output();
-
- setup_ignore();
-
-#ifdef __linux__
- ptrace(PTRACE_SETOPTIONS, pid, nullptr, PTRACE_O_TRACEEXIT);
- ptrace(PTRACE_CONT, pid, 0, 0);
-#elif defined BSD
- ptrace(PT_CONTINUE, pid, (caddr_t)1, 0);
-#else
-# error "no ptrace equivalent coded for this platform"
-#endif
-}
-
-static constexpr auto ignored_local_variables = {
- std::make_pair("e", "*"),
- std::make_pair("_log_ev", "*"),
-
- /* Ignore local variable about time used for tracing */
- std::make_pair("start_time", "*"),
-};
-
-void ModelChecker::setup_ignore()
-{
- const RemoteSimulation& process = this->get_remote_simulation();
- for (auto const& var : ignored_local_variables)
- process.ignore_local_variable(var.first, var.second);
-
- /* Static variable used for tracing */
- process.ignore_global_variable("counter");
-}
-
-void ModelChecker::shutdown()
-{
- XBT_DEBUG("Shutting down model-checker");
-
- RemoteSimulation* process = &this->get_remote_simulation();
- if (process->running()) {
- XBT_DEBUG("Killing process");
- kill(process->pid(), SIGKILL);
- process->terminate();
- }
-}
-
-void ModelChecker::resume(RemoteSimulation& process)
-{
- int res = checker_side_.get_channel().send(MC_MESSAGE_CONTINUE);
- if (res)
- throw xbt::errno_error();
- process.clear_cache();
-}
-
-static void MC_report_crash(int status)
-{
- XBT_INFO("**************************");
- XBT_INFO("** CRASH IN THE PROGRAM **");
- XBT_INFO("**************************");
- if (WIFSIGNALED(status))
- XBT_INFO("From signal: %s", strsignal(WTERMSIG(status)));
- else if (WIFEXITED(status))
- XBT_INFO("From exit: %i", WEXITSTATUS(status));
- if (not xbt_log_no_loc)
- XBT_INFO("%s core dump was generated by the system.", WCOREDUMP(status) ? "A" : "No");
- XBT_INFO("Counter-example execution trace:");
- for (auto const& s : mc_model_checker->getChecker()->get_textual_trace())
- XBT_INFO(" %s", s.c_str());
- dumpRecordPath();
- session->log_state();
- if (xbt_log_no_loc) {
- XBT_INFO("Stack trace not displayed because you passed --log=no_loc");
- } else {
- XBT_INFO("Stack trace:");
- mc_model_checker->get_remote_simulation().dump_stack();
- }
-}
-
-static void MC_report_assertion_error()
-{
- XBT_INFO("**************************");
- XBT_INFO("*** PROPERTY NOT VALID ***");
- XBT_INFO("**************************");
- XBT_INFO("Counter-example execution trace:");
- for (auto const& s : mc_model_checker->getChecker()->get_textual_trace())
- XBT_INFO(" %s", s.c_str());
- dumpRecordPath();
- session->log_state();
-}
-