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 a385dfc..670f719 100644 (file)
@@ -30,7 +30,7 @@
 #include "src/mc/mc_private.h"
 #include "src/mc/mc_ignore.h"
 #include "src/mc/mc_exit.h"
-#include "src/mc/mc_liveness.h"
+#include "src/mc/Transition.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_ModelChecker, mc, "ModelChecker");
 
@@ -88,7 +88,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;
 
@@ -118,9 +118,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);
@@ -173,10 +170,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
@@ -310,7 +307,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);
@@ -426,19 +423,38 @@ void ModelChecker::wait_client(simgrid::mc::Process& process)
       return;
 }
 
-void ModelChecker::simcall_handle(simgrid::mc::Process& process, unsigned long pid, int value)
+void ModelChecker::handle_simcall(Transition const& transition)
 {
   s_mc_simcall_handle_message m;
   memset(&m, 0, sizeof(m));
   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;
-  while (process.running())
+  m.pid   = transition.pid;
+  m.value = transition.argument;
+  this->process_->getChannel().send(m);
+  this->process_->clear_cache();
+  while (this->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;
+}
+
 }
 }