Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Check variable size in MC_process_read_variable()
[simgrid.git] / src / mc / mc_process.c
index 0beaf82..9c89ada 100644 (file)
@@ -25,8 +25,7 @@
 #include "mc_unw.h"
 #include "mc_snapshot.h"
 #include "mc_ignore.h"
-
-#include "simix/smx_private.h"
+#include "mc_smx.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_process, mc,
                                 "MC process information");
@@ -82,8 +81,8 @@ void MC_process_init(mc_process_t process, pid_t pid, int sockfd)
     &process->heap_address, std_heap_var->address, sizeof(struct mdesc*),
     MC_PROCESS_INDEX_DISABLED);
 
-  process->smx_process_infos = mc_smx_process_info_list_new();
-  process->smx_old_process_infos = mc_smx_process_info_list_new();
+  process->smx_process_infos = MC_smx_process_info_list_new();
+  process->smx_old_process_infos = MC_smx_process_info_list_new();
 
   process->checkpoint_ignore = MC_checkpoint_ignore_new();
 
@@ -178,66 +177,6 @@ void MC_process_refresh_malloc_info(mc_process_t process)
     MC_PROCESS_INDEX_DISABLED);
 }
 
-/** Load the remote swag of processes into a dynar
- *
- *  @param process     MCed process
- *  @param target      Local dynar (to be filled with copies of `s_smx_process_t`)
- *  @param remote_swag Address of the process SWAG in the remote list
- */
-static void MC_process_refresh_simix_process_list(
-  mc_process_t process,
-  xbt_dynar_t target, xbt_swag_t remote_swag)
-{
-  // swag = REMOTE(*simix_global->process_list)
-  s_xbt_swag_t swag;
-  MC_process_read(process, MC_PROCESS_NO_FLAG, &swag, remote_swag, sizeof(swag),
-    MC_PROCESS_INDEX_ANY);
-
-  smx_process_t p;
-  xbt_dynar_reset(target);
-
-  int i = 0;
-  for (p = swag.head; p; ++i) {
-
-    s_mc_smx_process_info_t info;
-    info.address = p;
-    MC_process_read(process, MC_PROCESS_NO_FLAG,
-      &info.copy, p, sizeof(info.copy), MC_PROCESS_INDEX_ANY);
-    xbt_dynar_push(target, &info);
-
-    // Lookup next process address:
-    p = xbt_swag_getNext(&info.copy, swag.offset);
-  }
-  assert(i == swag.count);
-}
-
-void MC_process_refresh_simix_processes(mc_process_t process)
-{
-  if (process->cache_flags & MC_PROCESS_CACHE_FLAG_SIMIX_PROCESSES)
-    return;
-
-  xbt_mheap_t heap = mmalloc_set_current_heap(mc_heap);
-
-  // TODO, avoid to reload `&simix_global`, `simix_global`, `*simix_global`
-
-  // simix_global_p = REMOTE(simix_global);
-  smx_global_t simix_global_p;
-  MC_process_read_variable(process, "simix_global", &simix_global_p, sizeof(simix_global_p));
-
-  // simix_global = REMOTE(*simix_global)
-  s_smx_global_t simix_global;
-  MC_process_read(process, MC_PROCESS_NO_FLAG, &simix_global, simix_global_p, sizeof(simix_global),
-    MC_PROCESS_INDEX_ANY);
-
-  MC_process_refresh_simix_process_list(
-    process, process->smx_process_infos, simix_global.process_list);
-  MC_process_refresh_simix_process_list(
-    process, process->smx_old_process_infos, simix_global.process_to_destroy);
-
-  process->cache_flags |= MC_PROCESS_CACHE_FLAG_SIMIX_PROCESSES;
-  mmalloc_set_current_heap(heap);
-}
-
 #define SO_RE "\\.so[\\.0-9]*$"
 #define VERSION_RE "-[\\.0-9]*$"
 
@@ -466,6 +405,11 @@ void MC_process_read_variable(mc_process_t process, const char* name, void* targ
   dw_variable_t var = MC_process_find_variable_by_name(process, name);
   if (!var->address)
     xbt_die("No simple location for this variable");
+  if (!var->type->full_type)
+    xbt_die("Partial type for %s, cannot check size", name);
+  if (var->type->full_type->byte_size != size)
+    xbt_die("Unexpected size for %s (expected %zi, was %zi)",
+      name, size, (size_t) var->type->full_type->byte_size);
   MC_process_read(process, MC_PROCESS_NO_FLAG, target, var->address, size,
     MC_PROCESS_INDEX_ANY);
 }
@@ -563,6 +507,24 @@ const void* MC_process_read(mc_process_t process, e_adress_space_read_flags_t fl
   }
 }
 
+const void* MC_process_read_simple(mc_process_t process,
+  void* local, const void* remote, size_t len)
+{
+  e_adress_space_read_flags_t flags = MC_PROCESS_NO_FLAG;
+  int index = MC_PROCESS_INDEX_ANY;
+   MC_process_read(process, flags, local, remote, len, index);
+   return local;
+}
+
+const void* MC_process_read_dynar_element(mc_process_t process,
+  void* local, const void* remote_dynar, size_t i)
+{
+  s_xbt_dynar_t d;
+  MC_process_read_simple(process, &d, remote_dynar, sizeof(d));
+  MC_process_read_simple(process, local, xbt_dynar_get_ptr(&d, i), i);
+  return local;
+}
+
 void MC_process_write(mc_process_t process, const void* local, void* remote, size_t len)
 {
   if (MC_process_is_self(process)) {
@@ -573,6 +535,16 @@ void MC_process_write(mc_process_t process, const void* local, void* remote, siz
   }
 }
 
+unsigned long MC_process_read_dynar_length(mc_process_t process, const void* remote_dynar)
+{
+  if (!remote_dynar)
+    return 0;
+  unsigned long res;
+  MC_process_read_simple(process, &res,
+    &((xbt_dynar_t)remote_dynar)->used, sizeof(res));
+  return res;
+}
+
 static pthread_once_t zero_buffer_flag = PTHREAD_ONCE_INIT;
 static const void* zero_buffer;
 static const int zero_buffer_size = 10 * 4096;
@@ -603,38 +575,6 @@ void MC_process_clear_memory(mc_process_t process, void* remote, size_t len)
   }
 }
 
-/** Get the issuer of a simcall (`req->issuer`)
- *
- *  In split-process mode, it does the black magic necessary to get an address
- *  of a (shallow) copy of the data structure the issuer SIMIX process in the local
- *  address space.
- *
- *  @param process the MCed process
- *  @param req     the simcall (copied in the local process)
- */
-smx_process_t MC_process_get_issuer(mc_process_t process, smx_simcall_t req)
-{
-  if (MC_process_is_self(&mc_model_checker->process))
-    return req->issuer;
-
-  MC_process_refresh_simix_processes(process);
-
-  // This is the address of the smx_process in the MCed process:
-  void* address = req->issuer;
-
-  unsigned i;
-  mc_smx_process_info_t p;
-
-  xbt_dynar_foreach_ptr(process->smx_process_infos, i, p)
-    if (p->address == address)
-      return &p->copy;
-  xbt_dynar_foreach_ptr(process->smx_old_process_infos, i, p)
-    if (p->address == address)
-      return &p->copy;
-
-  xbt_die("Issuer not found");
-}
-
 void MC_simcall_handle(smx_simcall_t req, int value)
 {
   if (MC_process_is_self(&mc_model_checker->process)) {
@@ -642,7 +582,7 @@ void MC_simcall_handle(smx_simcall_t req, int value)
     return;
   }
 
-  MC_process_refresh_simix_processes(&mc_model_checker->process);
+  MC_process_smx_refresh(&mc_model_checker->process);
 
   unsigned i;
   mc_smx_process_info_t pi = NULL;
@@ -666,8 +606,3 @@ void MC_simcall_handle(smx_simcall_t req, int value)
 
   xbt_die("Could not find the request");
 }
-
-void mc_smx_process_info_clear(mc_smx_process_info_t p)
-{
-  // Nothing yet
-}