Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
MC: Reap all zombie childs to avoid them to accumulate
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Thu, 6 Apr 2023 15:48:05 +0000 (17:48 +0200)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Thu, 6 Apr 2023 15:48:05 +0000 (17:48 +0200)
src/mc/remote/AppSide.cpp
src/mc/remote/AppSide.hpp

index 958869a..b66d7a1 100644 (file)
@@ -152,7 +152,13 @@ void AppSide::handle_finalize(const s_mc_message_int_t* msg) const
 }
 void AppSide::handle_fork(const s_mc_message_int_t* msg)
 {
-  int pid = fork();
+  int status;
+  int pid;
+  /* Reap any zombie child, saving its status for later use in AppSide::handle_wait_child() */
+  while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
+    child_statuses_[pid] = status;
+
+  pid = fork();
   xbt_assert(pid >= 0, "Could not fork application sub-process: %s.", strerror(errno));
 
   if (pid == 0) { // Child
@@ -186,7 +192,12 @@ void AppSide::handle_wait_child(const s_mc_message_int_t* msg)
 {
   int status;
   errno = 0;
-  waitpid(msg->value, &status, 0);
+  if (auto search = child_statuses_.find(msg->value); search != child_statuses_.end()) {
+    status = search->second;
+    child_statuses_.erase(search); // We only need this info once
+  } else {
+    waitpid(msg->value, &status, 0);
+  }
   xbt_assert(errno == 0, "Cannot wait on behalf of the checker: %s.", strerror(errno));
 
   s_mc_message_int_t answer = {};
index fba78bc..03ed138 100644 (file)
@@ -23,6 +23,7 @@ private:
   Channel channel_;
   static std::unique_ptr<AppSide> instance_;
   bool need_memory_info_ = false; /* by default we don't send memory info, unless we got a NEED_MEMINFO */
+  std::unordered_map<int, int> child_statuses_;
 
 public:
   AppSide();