Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Basic support for more other libraries than libsimgrid.so
[simgrid.git] / src / mc / mc_ignore.c
index 480a74b..0675eb9 100644 (file)
@@ -5,8 +5,10 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "internal_config.h"
+#include "mc_object_info.h"
 #include "mc_private.h"
 #include "smpi/private.h"
+#include "mc/mc_snapshot.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_ignore, mc,
                                 "Logging specific to MC ignore mechanism");
@@ -173,31 +175,34 @@ void MC_remove_ignore_heap(void *address, size_t size)
 
 void MC_ignore_global_variable(const char *name)
 {
-
+  mc_process_t process = &mc_model_checker->process;
   int raw_mem_set = (mmalloc_get_current_heap() == mc_heap);
 
   MC_SET_MC_HEAP;
 
-  xbt_assert(mc_libsimgrid_info, "MC subsystem not initialized");
+  xbt_assert(process->object_infos, "MC subsystem not initialized");
 
-  unsigned int cursor = 0;
-  dw_variable_t current_var;
-  int start = 0;
-  int end = xbt_dynar_length(mc_libsimgrid_info->global_variables) - 1;
+  size_t n = process->object_infos_size;
+  for (size_t i=0; i!=n; ++i) {
+    mc_object_info_t info = process->object_infos[i];
 
-  while (start <= end) {
-    cursor = (start + end) / 2;
-    current_var =
-        (dw_variable_t) xbt_dynar_get_as(mc_libsimgrid_info->global_variables,
-                                         cursor, dw_variable_t);
-    if (strcmp(current_var->name, name) == 0) {
-      xbt_dynar_remove_at(mc_libsimgrid_info->global_variables, cursor, NULL);
-      start = 0;
-      end = xbt_dynar_length(mc_libsimgrid_info->global_variables) - 1;
-    } else if (strcmp(current_var->name, name) < 0) {
-      start = cursor + 1;
-    } else {
-      end = cursor - 1;
+    // Binary search:
+    int start = 0;
+    int end = xbt_dynar_length(info->global_variables) - 1;
+    while (start <= end) {
+      unsigned int cursor = (start + end) / 2;
+      dw_variable_t current_var =
+          (dw_variable_t) xbt_dynar_get_as(info->global_variables,
+                                           cursor, dw_variable_t);
+      if (strcmp(current_var->name, name) == 0) {
+        xbt_dynar_remove_at(info->global_variables, cursor, NULL);
+        start = 0;
+        end = xbt_dynar_length(info->global_variables) - 1;
+      } else if (strcmp(current_var->name, name) < 0) {
+        start = cursor + 1;
+      } else {
+        end = cursor - 1;
+      }
     }
   }
 
@@ -224,7 +229,8 @@ static void mc_ignore_local_variable_in_scope(const char *var_name,
   // Processing of direct variables:
 
   // If the current subprogram matche the given name:
-  if (subprogram_name == NULL || strcmp(subprogram_name, subprogram->name) == 0) {
+  if (!subprogram_name ||
+      (subprogram->name && strcmp(subprogram_name, subprogram->name) == 0)) {
 
     // Try to find the variable and remove it:
     int start = 0;
@@ -282,6 +288,8 @@ static void MC_ignore_local_variable_in_object(const char *var_name,
 
 void MC_ignore_local_variable(const char *var_name, const char *frame_name)
 {
+  mc_process_t process = &mc_model_checker->process;
+
 
   int raw_mem_set = (mmalloc_get_current_heap() == mc_heap);
 
@@ -290,9 +298,9 @@ void MC_ignore_local_variable(const char *var_name, const char *frame_name)
 
   MC_SET_MC_HEAP;
 
-  MC_ignore_local_variable_in_object(var_name, frame_name, mc_libsimgrid_info);
+  MC_ignore_local_variable_in_object(var_name, frame_name, process->libsimgrid_info);
   if (frame_name != NULL)
-    MC_ignore_local_variable_in_object(var_name, frame_name, mc_binary_info);
+    MC_ignore_local_variable_in_object(var_name, frame_name, process->binary_info);
 
   if (!raw_mem_set)
     MC_SET_STD_HEAP;