Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Dont use handle_waitpid after we killed the App, as this function may report this...
[simgrid.git] / src / mc / remote / CheckerSide.cpp
index da98ad5..9cc1f7d 100644 (file)
@@ -133,7 +133,7 @@ void CheckerSide::setup_events()
 
   socket_event_ = event_new(
       base, get_channel().get_socket(), EV_READ | EV_PERSIST,
-      [](evutil_socket_t sig, short events, void* arg) {
+      [](evutil_socket_t, short events, void* arg) {
         auto checker = static_cast<simgrid::mc::CheckerSide*>(arg);
         if (events == EV_READ) {
           std::array<char, MC_MESSAGE_LENGTH> buffer;
@@ -193,8 +193,6 @@ CheckerSide::CheckerSide(const std::vector<char*>& args, bool need_memory_intros
   setup_events();
   wait_application_process(pid_);
 
-  wait_for_requests();
-
   // Request the initial memory on need
   if (need_memory_introspection) {
     channel_.send(MessageType::INITIAL_ADDRESSES);
@@ -209,6 +207,8 @@ CheckerSide::CheckerSide(const std::vector<char*>& args, bool need_memory_intros
     /* We now have enough info to create the memory address space */
     remote_memory_ = std::make_unique<simgrid::mc::RemoteProcessMemory>(pid_, answer.mmalloc_default_mdp);
   }
+
+  wait_for_requests();
 }
 
 CheckerSide::~CheckerSide()
@@ -217,6 +217,32 @@ CheckerSide::~CheckerSide()
   event_free(socket_event_);
   event_del(signal_event_);
   event_free(signal_event_);
+
+  if (running()) {
+    XBT_DEBUG("Killing process");
+    kill(get_pid(), SIGKILL);
+    while (waitpid(-1, nullptr, WNOHANG) > 0) {
+      /* we don't really care about errors here, as we are shutting things down anyway */
+      /* The child will get ripped by the next waitpid anyway */
+    }
+  }
+  // usleep(500); // Try to reduce the load on my system. Commented because it's not even enough :(
+}
+
+void CheckerSide::finalize(bool terminate_asap)
+{
+  s_mc_message_int_t m = {};
+  m.type               = MessageType::FINALIZE;
+  m.value              = terminate_asap;
+  xbt_assert(get_channel().send(m) == 0, "Could not ask the app to finalize on need");
+
+  s_mc_message_t answer;
+  ssize_t s = get_channel().receive(answer);
+  xbt_assert(s != -1, "Could not receive answer to FINALIZE");
+  xbt_assert(s == sizeof answer, "Broken message (size=%zd; expected %zu)", s, sizeof answer);
+  xbt_assert(answer.type == MessageType::FINALIZE_REPLY,
+             "Received unexpected message %s (%i); expected MessageType::FINALIZE_REPLY (%i)", to_c_str(answer.type),
+             (int)answer.type, (int)MessageType::FINALIZE_REPLY);
 }
 
 void CheckerSide::dispatch_events() const
@@ -259,7 +285,7 @@ bool CheckerSide::handle_message(const char* buffer, ssize_t size)
         s_mc_message_ignore_memory_t message;
         xbt_assert(size == sizeof(message), "Broken message");
         memcpy(&message, buffer, sizeof(message));
-        get_remote_memory()->unignore_heap((void*)(std::uintptr_t)message.addr, message.size);
+        get_remote_memory()->unignore_heap((void*)message.addr, message.size);
       } else {
         XBT_INFO("Ignoring an UNIGNORE_HEAP message because we don't need to introspect memory.");
       }
@@ -342,8 +368,7 @@ void CheckerSide::handle_waitpid()
         xbt_assert(not this->running(), "Inconsistent state");
         break;
       } else {
-        XBT_ERROR("Could not wait for pid");
-        throw simgrid::xbt::errno_error();
+        xbt_die("Could not wait for pid: %s", strerror(errno));
       }
     }