Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of framagit.org:simgrid/simgrid
[simgrid.git] / src / mc / remote / AppSide.cpp
index aaad666..376e8b6 100644 (file)
@@ -6,9 +6,10 @@
 #include "src/mc/remote/AppSide.hpp"
 #include "src/internal_config.h"
 #include "src/kernel/actor/ActorImpl.hpp"
-#include "src/mc/checker/SimcallObserver.hpp"
+#include "src/kernel/actor/SimcallObserver.hpp"
 #include "src/mc/remote/RemoteProcess.hpp"
-#include "src/xbt_modinter.h" /* mmalloc_preinit to get the default mmalloc arena address */
+#include "xbt/coverage.h"
+#include "xbt/xbt_modinter.h" /* mmalloc_preinit to get the default mmalloc arena address */
 #include <simgrid/modelchecker.h>
 
 #include <cerrno>
@@ -45,8 +46,7 @@ AppSide* AppSide::initialize()
   // Check the socket type/validity:
   int type;
   socklen_t socklen = sizeof(type);
-  if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &socklen) != 0)
-    xbt_die("Could not check socket type");
+  xbt_assert(getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &socklen) == 0, "Could not check socket type");
   xbt_assert(type == SOCK_SEQPACKET, "Unexpected socket type %i", type);
   XBT_DEBUG("Model-checked application found expected socket type");
 
@@ -61,8 +61,8 @@ AppSide* AppSide::initialize()
 #else
 #error "no ptrace equivalent coded for this platform"
 #endif
-  if (errno != 0 || raise(SIGSTOP) != 0)
-    xbt_die("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));
 
   s_mc_message_initial_addresses_t message{
       MessageType::INITIAL_ADDRESSES, mmalloc_preinit(), simgrid::kernel::actor::get_maxpid_addr(),
@@ -91,11 +91,10 @@ void AppSide::handle_deadlock_check(const s_mc_message_t*) const
 }
 void AppSide::handle_simcall_execute(const s_mc_message_simcall_handle_t* message) const
 {
-  kernel::actor::ActorImpl* process = kernel::actor::ActorImpl::by_pid(message->pid_);
-  xbt_assert(process != nullptr, "Invalid pid %lu", message->pid_);
+  kernel::actor::ActorImpl* process = kernel::actor::ActorImpl::by_pid(message->aid_);
+  xbt_assert(process != nullptr, "Invalid pid %lu", message->aid_);
   process->simcall_handle(message->times_considered_);
-  if (channel_.send(MessageType::WAITING))
-    xbt_die("Could not send MESSAGE_WAITING to model-checker");
+  xbt_assert(channel_.send(MessageType::WAITING) == 0, "Could not send MESSAGE_WAITING to model-checker");
 }
 
 void AppSide::handle_actor_enabled(const s_mc_message_actor_enabled_t* msg) const
@@ -185,14 +184,23 @@ void AppSide::handle_messages() const
         break;
 
       case MessageType::FINALIZE: {
+        assert_msg_size("FINALIZE", s_mc_message_int_t);
+        bool terminate_asap = ((s_mc_message_int_t*)message_buffer.data())->value;
+        XBT_DEBUG("Finalize (terminate = %d)", (int)terminate_asap);
+        if (not terminate_asap) {
+          if (XBT_LOG_ISENABLED(mc_client, xbt_log_priority_debug))
+            simix_global->display_all_actor_status();
 #if HAVE_SMPI
-        XBT_INFO("Finalize. Smpi_enabled: %d", (int)smpi_enabled());
-        simix_global->display_all_actor_status();
-        if (smpi_enabled())
-          SMPI_finalize();
+          XBT_DEBUG("Smpi_enabled: %d", (int)smpi_enabled());
+          if (smpi_enabled())
+            SMPI_finalize();
 #endif
-        s_mc_message_int_t answer{MessageType::DEADLOCK_CHECK_REPLY, 0};
-        xbt_assert(channel_.send(answer) == 0, "Could answer to FINALIZE");
+        }
+        coverage_checkpoint();
+        xbt_assert(channel_.send(MessageType::DEADLOCK_CHECK_REPLY) == 0, // DEADLOCK_CHECK_REPLY, really?
+                   "Could not answer to FINALIZE");
+        if (terminate_asap)
+          ::_Exit(0);
         break;
       }
 
@@ -205,6 +213,7 @@ void AppSide::handle_messages() const
 
 void AppSide::main_loop() const
 {
+  coverage_checkpoint();
   while (true) {
     simgrid::mc::execute_actors();
     xbt_assert(channel_.send(MessageType::WAITING) == 0, "Could not send WAITING message to model-checker");
@@ -214,8 +223,7 @@ void AppSide::main_loop() const
 
 void AppSide::report_assertion_failure() const
 {
-  if (channel_.send(MessageType::ASSERTION_FAILED))
-    xbt_die("Could not send assertion to model-checker");
+  xbt_assert(channel_.send(MessageType::ASSERTION_FAILED) == 0, "Could not send assertion to model-checker");
   this->handle_messages();
 }
 
@@ -225,8 +233,7 @@ void AppSide::ignore_memory(void* addr, std::size_t size) const
   message.type = MessageType::IGNORE_MEMORY;
   message.addr = (std::uintptr_t)addr;
   message.size = size;
-  if (channel_.send(message))
-    xbt_die("Could not send IGNORE_MEMORY message to model-checker");
+  xbt_assert(channel_.send(message) == 0, "Could not send IGNORE_MEMORY message to model-checker");
 }
 
 void AppSide::ignore_heap(void* address, std::size_t size) const
@@ -246,8 +253,7 @@ void AppSide::ignore_heap(void* address, std::size_t size) const
     heap->heapinfo[message.block].busy_frag.ignore[message.fragment]++;
   }
 
-  if (channel_.send(message))
-    xbt_die("Could not send ignored region to MCer");
+  xbt_assert(channel_.send(message) == 0, "Could not send ignored region to MCer");
 }
 
 void AppSide::unignore_heap(void* address, std::size_t size) const
@@ -256,21 +262,18 @@ void AppSide::unignore_heap(void* address, std::size_t size) const
   message.type = MessageType::UNIGNORE_HEAP;
   message.addr = (std::uintptr_t)address;
   message.size = size;
-  if (channel_.send(message))
-    xbt_die("Could not send IGNORE_HEAP message to model-checker");
+  xbt_assert(channel_.send(message) == 0, "Could not send IGNORE_HEAP message to model-checker");
 }
 
 void AppSide::declare_symbol(const char* name, int* value) const
 {
   s_mc_message_register_symbol_t message;
   message.type = MessageType::REGISTER_SYMBOL;
-  if (strlen(name) + 1 > message.name.size())
-    xbt_die("Symbol is too long");
+  xbt_assert(strlen(name) + 1 <= message.name.size(), "Symbol is too long");
   strncpy(message.name.data(), name, message.name.size());
   message.callback = nullptr;
   message.data     = value;
-  if (channel_.send(message))
-    xbt_die("Could send REGISTER_SYMBOL message to model-checker");
+  xbt_assert(channel_.send(message) == 0, "Could send REGISTER_SYMBOL message to model-checker");
 }
 
 void AppSide::declare_stack(void* stack, size_t size, ucontext_t* context) const
@@ -287,8 +290,7 @@ void AppSide::declare_stack(void* stack, size_t size, ucontext_t* context) const
   s_mc_message_stack_region_t message;
   message.type         = MessageType::STACK_REGION;
   message.stack_region = region;
-  if (channel_.send(message))
-    xbt_die("Could not send STACK_REGION to model-checker");
+  xbt_assert(channel_.send(message) == 0, "Could not send STACK_REGION to model-checker");
 }
 } // namespace mc
 } // namespace simgrid