Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Cross-process MC/safety implementation
[simgrid.git] / src / mc / mc_protocol.c
index 2815033..c519797 100644 (file)
@@ -19,6 +19,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_protocol, mc, "Generic MC protocol logic");
 
 int MC_protocol_send(int socket, void* message, size_t size)
 {
+  XBT_DEBUG("Protocol [%s] send %s",
+    MC_mode_name(mc_mode),
+    MC_message_type_name(*(e_mc_message_type*) message));
+
   while (send(socket, message, size, 0) == -1) {
     if (errno == EINTR)
       continue;
@@ -47,7 +51,7 @@ int MC_protocol_hello(int socket)
   message.type = MC_MESSAGE_NONE;
 
   size_t s;
-  while ((s = recv(socket, &message, sizeof(message), 0)) == -1) {
+  while ((s = MC_receive_message(socket, &message, sizeof(message), 0)) == -1) {
     if (errno == EINTR)
       continue;
     else {
@@ -63,7 +67,63 @@ int MC_protocol_hello(int socket)
   return 0;
 }
 
-ssize_t MC_receive_message(int socket, void* message, size_t size)
+ssize_t MC_receive_message(int socket, void* message, size_t size, int options)
+{
+  int res = recv(socket, message, size, options);
+  if (res != -1) {
+    XBT_DEBUG("Protocol [%s] received %s",
+      MC_mode_name(mc_mode),
+      MC_message_type_name(*(e_mc_message_type*) message));
+  }
+  return res;
+}
+
+const char* MC_message_type_name(e_mc_message_type type)
 {
-  return recv(socket, message, size, 0);
+  switch(type) {
+  case MC_MESSAGE_NONE:
+    return "NONE";
+  case MC_MESSAGE_HELLO:
+    return "HELLO";
+  case MC_MESSAGE_CONTINUE:
+    return "CONTINUE";
+  case MC_MESSAGE_IGNORE_HEAP:
+    return "IGNORE_HEAP";
+  case MC_MESSAGE_UNIGNORE_HEAP:
+    return "UNIGNORE_HEAP";
+  case MC_MESSAGE_IGNORE_MEMORY:
+    return "IGNORE_MEMORY";
+  case MC_MESSAGE_STACK_REGION:
+    return "STACK_REGION";
+  case MC_MESSAGE_REGISTER_SYMBOL:
+    return "REGISTER_SYMBOL";
+  case MC_MESSAGE_DEADLOCK_CHECK:
+    return "DEADLOCK_CHECK";
+  case MC_MESSAGE_DEADLOCK_CHECK_REPLY:
+    return "DEADLOCK_CHECK_REPLY";
+  case MC_MESSAGE_WAITING:
+    return "WAITING";
+  case MC_MESSAGE_SIMCALL_HANDLE:
+    return "SIMCALL_HANDLE";
+  case MC_MESSAGE_ASSERTION_FAILED:
+    return "ASSERTION_FAILED";
+  default:
+    return "?";
+  }
+}
+
+const char* MC_mode_name(e_mc_mode_t mode)
+{
+  switch(mode) {
+  case MC_MODE_NONE:
+    return "NONE";
+  case MC_MODE_STANDALONE:
+    return "STANDALONE";
+  case MC_MODE_CLIENT:
+    return "CLIENT";
+  case MC_MODE_SERVER:
+    return "SERVER";
+  default:
+    return "?";
+  }
 }