Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of scm.gforge.inria.fr:/gitroot/simgrid/simgrid
[simgrid.git] / src / mc / ModelChecker.cpp
index 636f3ec..af180ca 100644 (file)
 #include "src/mc/mc_private.h"
 #include "src/mc/mc_ignore.h"
 #include "src/mc/mc_exit.h"
-#include "src/mc/mc_liveness.h"
-
-extern "C" {
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_ModelChecker, mc, "ModelChecker");
 
-}
-
 ::simgrid::mc::ModelChecker* mc_model_checker = nullptr;
 
 using simgrid::mc::remote;
@@ -92,7 +87,7 @@ void ModelChecker::start()
   // Prepare data for poll:
 
   struct pollfd* socket_pollfd = &fds_[SOCKET_FD_INDEX];
-  socket_pollfd->fd = process_->socket();;
+  socket_pollfd->fd = process_->getChannel().getSocket();
   socket_pollfd->events = POLLIN;
   socket_pollfd->revents = 0;
 
@@ -122,9 +117,6 @@ void ModelChecker::start()
   if ((_sg_mc_dot_output_file != nullptr) && (_sg_mc_dot_output_file[0] != '\0'))
     MC_init_dot_output();
 
-  /* Init parmap */
-  //parmap = xbt_parmap_mc_new(xbt_os_get_numcores(), XBT_PARMAP_DEFAULT);
-
   setup_ignore();
 
   ptrace(PTRACE_SETOPTIONS, pid, nullptr, PTRACE_O_TRACEEXIT);
@@ -177,10 +169,10 @@ void ModelChecker::shutdown()
 
 void ModelChecker::resume(simgrid::mc::Process& process)
 {
-  int res = process.send_message(MC_MESSAGE_CONTINUE);
+  int res = process.getChannel().send(MC_MESSAGE_CONTINUE);
   if (res)
     throw simgrid::xbt::errno_error(res);
-  process.cache_flags = (mc_process_cache_flags_t) 0;
+  process.clear_cache();
 }
 
 static
@@ -314,7 +306,7 @@ bool ModelChecker::handle_events()
 
   if (socket_pollfd->revents) {
     if (socket_pollfd->revents & POLLIN) {
-      ssize_t size = MC_receive_message(socket_pollfd->fd, buffer, sizeof(buffer), MSG_DONTWAIT);
+      ssize_t size = process_->getChannel().receive(buffer, sizeof(buffer), false);
       if (size == -1 && errno != EAGAIN)
         throw simgrid::xbt::errno_error(errno);
       return handle_message(buffer, size);
@@ -437,12 +429,31 @@ void ModelChecker::simcall_handle(simgrid::mc::Process& process, unsigned long p
   m.type  = MC_MESSAGE_SIMCALL_HANDLE;
   m.pid   = pid;
   m.value = value;
-  process.send_message(m);
-  process.cache_flags = (mc_process_cache_flags_t) 0;
+  process.getChannel().send(m);
+  process.clear_cache();
   while (process.running())
     if (!this->handle_events())
       return;
 }
 
+bool ModelChecker::checkDeadlock()
+{
+  int res;
+  if ((res = this->process().getChannel().send(MC_MESSAGE_DEADLOCK_CHECK)))
+    xbt_die("Could not check deadlock state");
+  s_mc_int_message_t message;
+  ssize_t s = mc_model_checker->process().getChannel().receive(message);
+  if (s == -1)
+    xbt_die("Could not receive message");
+  if (s != sizeof(message) || message.type != MC_MESSAGE_DEADLOCK_CHECK_REPLY)
+    xbt_die("%s received unexpected message %s (%i, size=%i) "
+      "expected MC_MESSAGE_DEADLOCK_CHECK_REPLY (%i, size=%i)",
+      MC_mode_name(mc_mode),
+      MC_message_type_name(message.type), (int) message.type, (int) s,
+      (int) MC_MESSAGE_DEADLOCK_CHECK_REPLY, (int) sizeof(message)
+      );
+  return message.value != 0;
+}
+
 }
 }