Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix the refork feature by not ptracing App so that it dies properly
[simgrid.git] / src / mc / remote / AppSide.cpp
index 7e642f6..4baa059 100644 (file)
@@ -64,16 +64,19 @@ AppSide* AppSide::initialize()
   instance_ = std::make_unique<simgrid::mc::AppSide>(fd);
 
   // Wait for the model-checker:
-  errno = 0;
+  if (getenv("MC_NEED_PTRACE") != nullptr) {
+    errno = 0;
 #if defined __linux__
-  ptrace(PTRACE_TRACEME, 0, nullptr, nullptr);
+    ptrace(PTRACE_TRACEME, 0, nullptr, nullptr);
 #elif defined BSD
-  ptrace(PT_TRACE_ME, 0, nullptr, 0);
+    ptrace(PT_TRACE_ME, 0, nullptr, 0);
 #else
-#error "no ptrace equivalent coded for this platform"
+    xbt_die("no ptrace equivalent coded for this platform, please don't use the liveness checker here.");
 #endif
-  xbt_assert(errno == 0 && raise(SIGSTOP) == 0, "Could not wait for the model-checker (errno = %d: %s)", errno,
-             strerror(errno));
+
+    xbt_assert(errno == 0 && raise(SIGSTOP) == 0, "Could not wait for the model-checker (errno = %d: %s)", errno,
+               strerror(errno));
+  }
 
   instance_->handle_messages();
   return instance_.get();
@@ -158,26 +161,16 @@ void AppSide::handle_initial_addresses()
 void AppSide::handle_actors_status() const
 {
   auto const& actor_list = kernel::EngineImpl::get_instance()->get_actor_list();
-  const int num_actors   = actor_list.size();
-  XBT_DEBUG("Serialize the actors to answer ACTORS_STATUS from the checker. %d actors to go.", num_actors);
-
-  std::vector<s_mc_message_actors_status_one_t> status(num_actors);
-  int i                 = 0;
-  int total_transitions = 0;
-
-  for (auto const& [aid, actor] : actor_list) {
-    status[i].aid            = aid;
-    status[i].enabled        = mc::actor_is_enabled(actor);
-    status[i].max_considered = actor->simcall_.observer_->get_max_consider();
-    status[i].n_transitions  = mc::actor_is_enabled(actor) ? status[i].max_considered : 0;
-    total_transitions += status[i].n_transitions;
-    i++;
-  }
+  XBT_DEBUG("Serialize the actors to answer ACTORS_STATUS from the checker. %zu actors to go.", actor_list.size());
+
+  std::vector<s_mc_message_actors_status_one_t> status;
+  for (auto const& [aid, actor] : actor_list)
+    status.emplace_back(s_mc_message_actors_status_one_t{aid, mc::actor_is_enabled(actor),
+                                                         actor->simcall_.observer_->get_max_consider()});
 
   struct s_mc_message_actors_status_answer_t answer = {};
   answer.type             = MessageType::ACTORS_STATUS_REPLY;
-  answer.count            = num_actors;
-  answer.transition_count = total_transitions;
+  answer.count            = static_cast<int>(status.size());
 
   xbt_assert(channel_.send(answer) == 0, "Could not send ACTORS_STATUS_REPLY msg");
   if (answer.count > 0) {