Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Reduce dependency on ptrace.
[simgrid.git] / src / mc / ModelChecker.cpp
index 4250bff..d60341e 100644 (file)
@@ -14,7 +14,6 @@
 #include "xbt/automaton.hpp"
 #include "xbt/system_error.hpp"
 
-#include <sys/ptrace.h>
 #include <sys/wait.h>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_ModelChecker, mc, "ModelChecker");
@@ -72,7 +71,7 @@ void ModelChecker::start()
   // The model-checked process SIGSTOP itself to signal it's ready:
   const pid_t pid = process_->pid();
 
-  pid_t res = waitpid(pid, &status, WAITPID_CHECKED_FLAGS);
+  pid_t res = waitpid(pid, &status, WUNTRACED | WAITPID_CHECKED_FLAGS);
   if (res < 0 || not WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP)
     xbt_die("Could not wait model-checked process");
 
@@ -83,14 +82,8 @@ void ModelChecker::start()
 
   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
+  if (kill(pid, SIGCONT) != 0)
+    throw simgrid::xbt::errno_error("Could not wake up the model-checked process");
 }
 
 static const std::pair<const char*, const char*> ignored_local_variables[] = {
@@ -310,36 +303,9 @@ void ModelChecker::handle_waitpid()
     }
 
     if (pid == this->process().pid()) {
-
-      // From PTRACE_O_TRACEEXIT:
-#ifdef __linux__
-      if (status>>8 == (SIGTRAP | (PTRACE_EVENT_EXIT<<8))) {
-        if (ptrace(PTRACE_GETEVENTMSG, this->process().pid(), 0, &status) == -1)
-          xbt_die("Could not get exit status");
-        if (WIFSIGNALED(status)) {
-          MC_report_crash(status);
-          mc_model_checker->exit(SIMGRID_MC_EXIT_PROGRAM_CRASH);
-        }
-      }
-#endif
-
-      // We don't care about signals, just reinject them:
-      if (WIFSTOPPED(status)) {
-        XBT_DEBUG("Stopped with signal %i", (int) WSTOPSIG(status));
-        errno = 0;
-#ifdef __linux__
-        ptrace(PTRACE_CONT, this->process().pid(), 0, WSTOPSIG(status));
-#elif defined BSD
-        ptrace(PT_CONTINUE, this->process().pid(), (caddr_t)1, WSTOPSIG(status));
-#endif
-        if (errno != 0)
-          xbt_die("Could not PTRACE_CONT");
-      }
-
-      else if (WIFEXITED(status) || WIFSIGNALED(status)) {
-        XBT_DEBUG("Child process is over");
-        this->process().terminate();
-      }
+      xbt_assert(WIFEXITED(status) || WIFSIGNALED(status));
+      XBT_DEBUG("Child process is over");
+      this->process().terminate();
     }
   }
 }