Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Communication of heap_area_to_ignore to the remote MCer
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 5 Feb 2015 14:03:51 +0000 (15:03 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Fri, 6 Feb 2015 09:33:06 +0000 (10:33 +0100)
src/mc/mc_client.c
src/mc/mc_client.h
src/mc/mc_global.c
src/mc/mc_ignore.c
src/simix/smx_global.c

index 120c05b..55cc2ca 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_client, mc, "MC client logic");
 
-s_mc_client_t mc_client;
+mc_client_t mc_client;
 
 void MC_client_init(void)
 {
-  mc_client.fd = -1;
-  mc_client.active = 1;
+  if (mc_client) {
+    XBT_WARN("MC_client_init called more than once.");
+    return;
+  }
+
   char* fd_env = getenv(MC_ENV_SOCKET_FD);
   if (!fd_env)
     xbt_die("MC socket not found");
@@ -40,13 +43,15 @@ void MC_client_init(void)
     xbt_die("Unexpected socket type %i", type);
   XBT_DEBUG("Model-checked application found expected socket type");
 
-  mc_client.fd = fd;
+  mc_client = xbt_new0(s_mc_client_t, 1);
+  mc_client->fd = fd;
+  mc_client->active = 1;
 }
 
 void MC_client_hello(void)
 {
   XBT_DEBUG("Greeting the MC server");
-  if (MC_protocol_hello(mc_client.fd) != 0)
+  if (MC_protocol_hello(mc_client->fd) != 0)
     xbt_die("Could not say hello the MC server");
   XBT_DEBUG("Greeted the MC server");
 }
@@ -58,7 +63,7 @@ void MC_client_handle_messages(void)
 
     char message_buffer[MC_MESSAGE_LENGTH];
     size_t s;
-    if ((s = recv(mc_client.fd, &message_buffer, sizeof(message_buffer), 0)) == -1)
+    if ((s = recv(mc_client->fd, &message_buffer, sizeof(message_buffer), 0)) == -1)
       xbt_die("Could not receive commands from the model-checker: %s",
         strerror(errno));
 
index fc1cf67..12234ed 100644 (file)
@@ -14,9 +14,9 @@ SG_BEGIN_DECL()
 typedef struct s_mc_client {
   int active;
   int fd;
-} s_mc_client_t, mc_client_t;
+} s_mc_client_t, *mc_client_t;
 
-extern s_mc_client_t mc_client;
+extern mc_client_t mc_client;
 
 void MC_client_init(void);
 void MC_client_hello(void);
index 901bfd6..3b13670 100644 (file)
@@ -111,7 +111,8 @@ mc_model_checker_t MC_model_checker_new(pid_t pid, int socket)
   return mc;
 }
 
-void MC_model_checker_delete(mc_model_checker_t mc) {
+void MC_model_checker_delete(mc_model_checker_t mc)
+{
   mc_pages_store_delete(mc->pages);
   if(mc->record)
     xbt_dynar_free(&mc->record);
@@ -119,6 +120,11 @@ void MC_model_checker_delete(mc_model_checker_t mc) {
 }
 
 void MC_init()
+{
+  MC_init_pid(getpid(), -1);
+}
+
+void MC_init_pid(pid_t pid, int socket)
 {
   if (mc_mode == MC_MODE_NONE) {
     if (getenv(MC_ENV_SOCKET_FD)) {
@@ -128,18 +134,6 @@ void MC_init()
     }
   }
 
-  MC_init_pid(getpid(), -1);
-
-  if (mc_mode == MC_MODE_CLIENT) {
-    MC_client_init();
-    MC_client_hello();
-    // This will move somehwere else:
-    MC_client_handle_messages();
-  }
-}
-
-void MC_init_pid(pid_t pid, int socket)
-{
   int raw_mem_set = (mmalloc_get_current_heap() == mc_heap);
 
   mc_time = xbt_new0(double, simix_process_maxpid);
@@ -222,6 +216,11 @@ void MC_init_pid(pid_t pid, int socket)
   if (raw_mem_set)
     MC_SET_MC_HEAP;
 
+  if (mc_mode == MC_MODE_CLIENT) {
+    // This will move somehwere else:
+    MC_client_handle_messages();
+  }
+
 }
 
 /*******************************  Core of MC *******************************/
index e16383a..5f8ea90 100644 (file)
@@ -9,6 +9,9 @@
 #include "mc_private.h"
 #include "smpi/private.h"
 #include "mc/mc_snapshot.h"
+#include "mc_ignore.h"
+#include "mc_protocol.h"
+#include "mc_client.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_ignore, mc,
                                 "Logging specific to MC ignore mechanism");
@@ -61,35 +64,10 @@ static void checkpoint_ignore_region_free_voidp(void *r)
 
 /***********************************************************************/
 
-// FIXME, cross-process support? (or make this it is used on the app-side)
-void MC_ignore_heap(void *address, size_t size)
+void MC_heap_region_ignore_insert(mc_heap_ignore_region_t region)
 {
-  if(!std_heap)
-    return;
-
   int raw_mem_set = (mmalloc_get_current_heap() == mc_heap);
 
-  MC_SET_MC_HEAP;
-
-  mc_heap_ignore_region_t region = NULL;
-  region = xbt_new0(s_mc_heap_ignore_region_t, 1);
-  region->address = address;
-  region->size = size;
-
-  region->block =
-      ((char *) address -
-       (char *) std_heap->heapbase) / BLOCKSIZE + 1;
-
-  if (std_heap->heapinfo[region->block].type == 0) {
-    region->fragment = -1;
-    std_heap->heapinfo[region->block].busy_block.ignore++;
-  } else {
-    region->fragment =
-        ((uintptr_t) (ADDR2UINT(address) % (BLOCKSIZE))) >> std_heap->
-        heapinfo[region->block].type;
-    std_heap->heapinfo[region->block].busy_frag.ignore[region->fragment]++;
-  }
-
   if (mc_heap_comparison_ignore == NULL) {
     mc_heap_comparison_ignore =
         xbt_dynar_new(sizeof(mc_heap_ignore_region_t),
@@ -105,25 +83,27 @@ void MC_ignore_heap(void *address, size_t size)
   int start = 0;
   int end = xbt_dynar_length(mc_heap_comparison_ignore) - 1;
 
+  // Find the position where we want to insert the mc_heap_ignore_region_t:
   while (start <= end) {
     cursor = (start + end) / 2;
     current_region =
         (mc_heap_ignore_region_t) xbt_dynar_get_as(mc_heap_comparison_ignore,
                                                    cursor,
                                                    mc_heap_ignore_region_t);
-    if (current_region->address == address) {
+    if (current_region->address == region->address) {
       heap_ignore_region_free(region);
       if (!raw_mem_set)
         MC_SET_STD_HEAP;
       return;
-    } else if (current_region->address < address) {
+    } else if (current_region->address < region->address) {
       start = cursor + 1;
     } else {
       end = cursor - 1;
     }
   }
 
-  if (current_region->address < address)
+  // Insert it mc_heap_ignore_region_t:
+  if (current_region->address < region->address)
     xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor + 1, &region);
   else
     xbt_dynar_insert_at(mc_heap_comparison_ignore, cursor, &region);
@@ -132,6 +112,56 @@ void MC_ignore_heap(void *address, size_t size)
     MC_SET_STD_HEAP;
 }
 
+void MC_heap_region_ignore_send(mc_heap_ignore_region_t region)
+{
+  s_mc_ignore_region_message_t message;
+  message.type = MC_MESSAGE_IGNORE_REGION;
+  message.region = *region;
+  if (MC_protocol_send(mc_client->fd, &message, sizeof(message)))
+    xbt_die("Could not send ignored region to MCer");
+  XBT_DEBUG("Sent ignored region to the model-checker");
+}
+
+// FIXME, cross-process support? (or make this it is used on the app-side)
+void MC_ignore_heap(void *address, size_t size)
+{
+  if(!std_heap)
+    return;
+
+  int raw_mem_set = (mmalloc_get_current_heap() == mc_heap);
+
+  MC_SET_MC_HEAP;
+
+  mc_heap_ignore_region_t region = NULL;
+  region = xbt_new0(s_mc_heap_ignore_region_t, 1);
+  region->address = address;
+  region->size = size;
+
+  region->block =
+      ((char *) address -
+       (char *) std_heap->heapbase) / BLOCKSIZE + 1;
+
+  if (std_heap->heapinfo[region->block].type == 0) {
+    region->fragment = -1;
+    std_heap->heapinfo[region->block].busy_block.ignore++;
+  } else {
+    region->fragment =
+        ((uintptr_t) (ADDR2UINT(address) % (BLOCKSIZE))) >> std_heap->
+        heapinfo[region->block].type;
+    std_heap->heapinfo[region->block].busy_frag.ignore[region->fragment]++;
+  }
+
+  MC_heap_region_ignore_insert(region);
+
+#if 1
+  if (mc_mode == MC_MODE_CLIENT)
+    MC_heap_region_ignore_send(region);
+#endif
+
+  if (!raw_mem_set)
+    MC_SET_STD_HEAP;
+}
+
 void MC_remove_ignore_heap(void *address, size_t size)
 {
 
index 6e3dac7..d568b5a 100644 (file)
@@ -4,6 +4,8 @@
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
+#include <stdlib.h>
+
 #include "smx_private.h"
 #include "xbt/heap.h"
 #include "xbt/sysdep.h"
@@ -15,6 +17,9 @@
 
 #ifdef HAVE_MC
 #include "mc/mc_private.h"
+#include "mc/mc_model_checker.h"
+#include "mc/mc_protocol.h"
+#include "mc/mc_client.h"
 #endif
 #include "mc/mc_record.h"
 
@@ -206,6 +211,20 @@ void SIMIX_global_init(int *argc, char **argv)
   if (sg_cfg_get_boolean("clean_atexit"))
     atexit(SIMIX_clean);
 
+#ifdef HAVE_MC
+  // The communication initialisation is done ASAP.
+  // We need to commuicate  initialisation of the different layers to the model-checker.
+  if (mc_mode == MC_MODE_NONE) {
+    if (getenv(MC_ENV_SOCKET_FD)) {
+      mc_mode = MC_MODE_CLIENT;
+      MC_client_init();
+      MC_client_hello();
+    } else {
+      mc_mode = MC_MODE_STANDALONE;
+    }
+  }
+#endif
+
   if (_sg_cfg_exit_asap)
     exit(0);
 }