Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Move handle_message from ModelChecker to RemoteProcessMemory
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Sun, 19 Mar 2023 13:29:05 +0000 (14:29 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Sun, 19 Mar 2023 13:34:34 +0000 (14:34 +0100)
src/mc/ModelChecker.cpp
src/mc/ModelChecker.hpp
src/mc/remote/CheckerSide.cpp
src/mc/sosp/RemoteProcessMemory.cpp
src/mc/sosp/RemoteProcessMemory.hpp

index 71a7f08..0a1a077 100644 (file)
@@ -30,82 +30,4 @@ ModelChecker::ModelChecker(std::unique_ptr<RemoteProcessMemory> remote_memory)
 {
 }
 
-bool ModelChecker::handle_message(const char* buffer, ssize_t size)
-{
-  s_mc_message_t base_message;
-  xbt_assert(size >= (ssize_t)sizeof(base_message), "Broken message");
-  memcpy(&base_message, buffer, sizeof(base_message));
-
-  switch(base_message.type) {
-    case MessageType::INITIAL_ADDRESSES: {
-      s_mc_message_initial_addresses_t message;
-      xbt_assert(size == sizeof(message), "Broken message. Got %d bytes instead of %d.", (int)size, (int)sizeof(message));
-      memcpy(&message, buffer, sizeof(message));
-
-      get_remote_process_memory().init(message.mmalloc_default_mdp);
-      break;
-    }
-
-    case MessageType::IGNORE_HEAP: {
-      s_mc_message_ignore_heap_t message;
-      xbt_assert(size == sizeof(message), "Broken message");
-      memcpy(&message, buffer, sizeof(message));
-
-      IgnoredHeapRegion region;
-      region.block    = message.block;
-      region.fragment = message.fragment;
-      region.address  = message.address;
-      region.size     = message.size;
-      get_remote_process_memory().ignore_heap(region);
-      break;
-    }
-
-    case MessageType::UNIGNORE_HEAP: {
-      s_mc_message_ignore_memory_t message;
-      xbt_assert(size == sizeof(message), "Broken message");
-      memcpy(&message, buffer, sizeof(message));
-      get_remote_process_memory().unignore_heap((void*)(std::uintptr_t)message.addr, message.size);
-      break;
-    }
-
-    case MessageType::IGNORE_MEMORY: {
-      s_mc_message_ignore_memory_t message;
-      xbt_assert(size == sizeof(message), "Broken message");
-      memcpy(&message, buffer, sizeof(message));
-      this->get_remote_process_memory().ignore_region(message.addr, message.size);
-      break;
-    }
-
-    case MessageType::STACK_REGION: {
-      s_mc_message_stack_region_t message;
-      xbt_assert(size == sizeof(message), "Broken message");
-      memcpy(&message, buffer, sizeof(message));
-      this->get_remote_process_memory().stack_areas().push_back(message.stack_region);
-    } break;
-
-    case MessageType::REGISTER_SYMBOL: {
-      s_mc_message_register_symbol_t message;
-      xbt_assert(size == sizeof(message), "Broken message");
-      memcpy(&message, buffer, sizeof(message));
-      xbt_assert(not message.callback, "Support for client-side function proposition is not implemented.");
-      XBT_DEBUG("Received symbol: %s", message.name.data());
-
-      LivenessChecker::automaton_register_symbol(get_remote_process_memory(), message.name.data(),
-                                                 remote((int*)message.data));
-      break;
-    }
-
-    case MessageType::WAITING:
-      return false;
-
-    case MessageType::ASSERTION_FAILED:
-      Exploration::get_instance()->report_assertion_failure();
-      break;
-
-    default:
-      xbt_die("Unexpected message from model-checked application");
-  }
-  return true;
-}
-
 } // namespace simgrid::mc
index d75a38d..41aa6cb 100644 (file)
@@ -26,8 +26,6 @@ public:
   explicit ModelChecker(std::unique_ptr<RemoteProcessMemory> remote_simulation);
 
   RemoteProcessMemory& get_remote_process_memory() { return *remote_process_memory_; }
-
-  bool handle_message(const char* buffer, ssize_t size); // FIXME move to RemoteApp
 };
 
 } // namespace simgrid::mc
index eeaee22..cf0d9e0 100644 (file)
@@ -31,7 +31,7 @@ CheckerSide::CheckerSide(int sockfd, ModelChecker* mc) : channel_(sockfd)
               throw simgrid::xbt::errno_error();
           }
 
-          if (not mc_model_checker->handle_message(buffer.data(), size))
+          if (not mc_model_checker->get_remote_process_memory().handle_message(buffer.data(), size))
             checker->break_loop();
         } else {
           xbt_die("Unexpected event");
index 1973a93..0bfb964 100644 (file)
@@ -8,6 +8,7 @@
 #include "src/mc/sosp/RemoteProcessMemory.hpp"
 
 #include "src/mc/explo/Exploration.hpp"
+#include "src/mc/explo/LivenessChecker.hpp"
 #include "src/mc/sosp/Snapshot.hpp"
 #include "xbt/file.hpp"
 #include "xbt/log.h"
@@ -455,6 +456,84 @@ void RemoteProcessMemory::dump_stack() const
   unw_destroy_addr_space(as);
 }
 
+bool RemoteProcessMemory::handle_message(const char* buffer, ssize_t size)
+{
+  s_mc_message_t base_message;
+  xbt_assert(size >= (ssize_t)sizeof(base_message), "Broken message");
+  memcpy(&base_message, buffer, sizeof(base_message));
+
+  switch (base_message.type) {
+    case MessageType::INITIAL_ADDRESSES: {
+      s_mc_message_initial_addresses_t message;
+      xbt_assert(size == sizeof(message), "Broken message. Got %d bytes instead of %d.", (int)size,
+                 (int)sizeof(message));
+      memcpy(&message, buffer, sizeof(message));
+
+      this->init(message.mmalloc_default_mdp);
+      break;
+    }
+
+    case MessageType::IGNORE_HEAP: {
+      s_mc_message_ignore_heap_t message;
+      xbt_assert(size == sizeof(message), "Broken message");
+      memcpy(&message, buffer, sizeof(message));
+
+      IgnoredHeapRegion region;
+      region.block    = message.block;
+      region.fragment = message.fragment;
+      region.address  = message.address;
+      region.size     = message.size;
+      this->ignore_heap(region);
+      break;
+    }
+
+    case MessageType::UNIGNORE_HEAP: {
+      s_mc_message_ignore_memory_t message;
+      xbt_assert(size == sizeof(message), "Broken message");
+      memcpy(&message, buffer, sizeof(message));
+      this->unignore_heap((void*)(std::uintptr_t)message.addr, message.size);
+      break;
+    }
+
+    case MessageType::IGNORE_MEMORY: {
+      s_mc_message_ignore_memory_t message;
+      xbt_assert(size == sizeof(message), "Broken message");
+      memcpy(&message, buffer, sizeof(message));
+      this->ignore_region(message.addr, message.size);
+      break;
+    }
+
+    case MessageType::STACK_REGION: {
+      s_mc_message_stack_region_t message;
+      xbt_assert(size == sizeof(message), "Broken message");
+      memcpy(&message, buffer, sizeof(message));
+      this->stack_areas().push_back(message.stack_region);
+    } break;
+
+    case MessageType::REGISTER_SYMBOL: {
+      s_mc_message_register_symbol_t message;
+      xbt_assert(size == sizeof(message), "Broken message");
+      memcpy(&message, buffer, sizeof(message));
+      xbt_assert(not message.callback, "Support for client-side function proposition is not implemented.");
+      XBT_DEBUG("Received symbol: %s", message.name.data());
+
+      LivenessChecker::automaton_register_symbol(*this, message.name.data(), remote((int*)message.data));
+      break;
+    }
+
+    case MessageType::WAITING:
+      return false;
+
+    case MessageType::ASSERTION_FAILED:
+      Exploration::get_instance()->report_assertion_failure();
+      break;
+
+    default:
+      xbt_die("Unexpected message from model-checked application");
+  }
+  return true;
+}
+
 void RemoteProcessMemory::handle_waitpid()
 {
   XBT_DEBUG("Check for wait event");
index db53549..b0eaeb6 100644 (file)
@@ -63,6 +63,7 @@ public:
   bool running() const { return running_; }
   void terminate() { running_ = false; }
   void handle_waitpid();
+  bool handle_message(const char* buffer, ssize_t size);
 
   /* ************* */
   /* Low-level API */