Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Add remote_ptr for marking pointers-to/addresses-in the remote process
[simgrid.git] / src / mc / mc_checkpoint.cpp
index 473a883..1822189 100644 (file)
@@ -35,6 +35,8 @@
 #include "mc_protocol.h"
 #include "mc_smx.h"
 
+using simgrid::mc::remote;
+
 extern "C" {
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_checkpoint, mc,
@@ -98,19 +100,6 @@ void MC_region_destroy(mc_mem_region_t region)
   xbt_free(region);
 }
 
-void MC_free_snapshot(mc_snapshot_t snapshot)
-{
-  for (size_t i = 0; i < snapshot->snapshot_regions_count; i++) {
-    MC_region_destroy(snapshot->snapshot_regions[i]);
-  }
-  xbt_free(snapshot->snapshot_regions);
-  xbt_free(snapshot->stack_sizes);
-  xbt_dynar_free(&(snapshot->stacks));
-  xbt_dynar_free(&(snapshot->to_ignore));
-  xbt_dynar_free(&snapshot->ignored_data);
-  xbt_free(snapshot);
-}
-
 /*******************************  Snapshot regions ********************************/
 /*********************************************************************************/
 
@@ -125,9 +114,9 @@ static mc_mem_region_t mc_region_new_dense(
   region->permanent_addr = permanent_addr;
   region->size = size;
   region->flat.data = xbt_malloc(size);
-  MC_process_read(&mc_model_checker->process, MC_ADDRESS_SPACE_READ_FLAGS_NONE,
-    region->flat.data, permanent_addr, size,
-    MC_PROCESS_INDEX_DISABLED);
+  mc_model_checker->process().read_bytes(region->flat.data, size,
+    remote(permanent_addr),
+    simgrid::mc::ProcessIndexDisabled);
   XBT_DEBUG("New region : type : %d, data : %p (real addr %p), size : %zu",
             region_type, region->flat.data, permanent_addr, size);
   return region;
@@ -163,12 +152,12 @@ static void MC_region_restore(mc_mem_region_t region)
     break;
 
   case MC_REGION_STORAGE_TYPE_FLAT:
-    MC_process_write(&mc_model_checker->process, region->flat.data,
+    MC_process_write(&mc_model_checker->process(), region->flat.data,
       region->permanent_addr, region->size);
     break;
 
   case MC_REGION_STORAGE_TYPE_CHUNKED:
-    mc_region_restore_sparse(&mc_model_checker->process, region);
+    mc_region_restore_sparse(&mc_model_checker->process(), region);
     break;
 
   case MC_REGION_STORAGE_TYPE_PRIVATIZED:
@@ -198,12 +187,13 @@ static mc_mem_region_t MC_region_new_privatized(
 
   // Read smpi_privatisation_regions from MCed:
   smpi_privatisation_region_t remote_smpi_privatisation_regions;
-  MC_process_read_variable(&mc_model_checker->process,
+  MC_process_read_variable(&mc_model_checker->process(),
     "smpi_privatisation_regions",
     &remote_smpi_privatisation_regions, sizeof(remote_smpi_privatisation_regions));
   s_smpi_privatisation_region_t privatisation_regions[process_count];
-  MC_process_read_simple(&mc_model_checker->process, &privatisation_regions,
-    remote_smpi_privatisation_regions, sizeof(privatisation_regions));
+  mc_model_checker->process().read_bytes(
+    &privatisation_regions, sizeof(privatisation_regions),
+    remote(remote_smpi_privatisation_regions));
 
   for (size_t i = 0; i < process_count; i++) {
     region->privatized.regions[i] =
@@ -248,7 +238,7 @@ static void MC_get_memory_regions(mc_process_t process, mc_snapshot_t snapshot)
       object_info->end_rw - object_info->start_rw);
   }
 
-  xbt_mheap_t heap = MC_process_get_heap(process);
+  xbt_mheap_t heap = process->get_heap();
   void *start_heap = heap->base;
   void *end_heap = heap->breakval;
 
@@ -257,18 +247,18 @@ static void MC_get_memory_regions(mc_process_t process, mc_snapshot_t snapshot)
                         (char *) end_heap - (char *) start_heap);
   snapshot->heap_bytes_used = mmalloc_get_bytes_used_remote(
     heap->heaplimit,
-    MC_process_get_malloc_info(process));
+    process->get_malloc_info());
 
 #ifdef HAVE_SMPI
   if (smpi_privatize_global_variables && MC_smpi_process_count()) {
     // snapshot->privatization_index = smpi_loaded_page
-    MC_process_read_variable(&mc_model_checker->process,
+    MC_process_read_variable(&mc_model_checker->process(),
       "smpi_loaded_page", &snapshot->privatization_index,
       sizeof(snapshot->privatization_index));
   } else
 #endif
   {
-    snapshot->privatization_index = MC_PROCESS_INDEX_MISSING;
+    snapshot->privatization_index = simgrid::mc::ProcessIndexMissing;
   }
 }
 
@@ -356,7 +346,7 @@ static bool mc_valid_variable(dw_variable_t var, dw_frame_t scope,
 static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame,
                                            dw_frame_t scope, int process_index, xbt_dynar_t result)
 {
-  mc_process_t process = &mc_model_checker->process;
+  mc_process_t process = &mc_model_checker->process();
 
   void *ip = (void *) stack_frame->ip;
   if (ip < scope->low_pc || ip >= scope->high_pc)
@@ -392,7 +382,7 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame,
         current_variable->object_info,
         &(stack_frame->unw_cursor),
         (void *) stack_frame->frame_base,
-        (mc_address_space_t) &mc_model_checker->process, process_index);
+        &mc_model_checker->process(), process_index);
 
       switch(mc_get_location_type(&location)) {
       case MC_LOCATION_TYPE_ADDRESS:
@@ -443,7 +433,7 @@ static void MC_stack_frame_free_voipd(void *s)
 
 static xbt_dynar_t MC_unwind_stack_frames(mc_unw_context_t stack_context)
 {
-  mc_process_t process = &mc_model_checker->process;
+  mc_process_t process = &mc_model_checker->process();
   xbt_dynar_t result =
       xbt_dynar_new(sizeof(mc_stack_frame_t), MC_stack_frame_free_voipd);
 
@@ -521,11 +511,11 @@ static xbt_dynar_t MC_take_snapshot_stacks(mc_snapshot_t * snapshot)
 
     // Read the context from remote process:
     unw_context_t context;
-    MC_process_read_simple(&mc_model_checker->process,
-      &context, (unw_context_t*) current_stack->context, sizeof(context));
+    mc_model_checker->process().read_bytes(
+      &context, sizeof(context), remote(current_stack->context));
 
     st->context = xbt_new0(s_mc_unw_context_t, 1);
-    if (mc_unw_init_context(st->context, &mc_model_checker->process,
+    if (mc_unw_init_context(st->context, &mc_model_checker->process(),
       &context) < 0) {
       xbt_die("Could not initialise the libunwind context.");
     }
@@ -587,20 +577,20 @@ static void MC_snapshot_handle_ignore(mc_snapshot_t snapshot)
   // Copy the memory:
   unsigned int cursor = 0;
   mc_checkpoint_ignore_region_t region;
-  xbt_dynar_foreach (mc_model_checker->process.checkpoint_ignore, cursor, region) {
+  xbt_dynar_foreach (mc_model_checker->process().checkpoint_ignore, cursor, region) {
     s_mc_snapshot_ignored_data_t ignored_data;
     ignored_data.start = region->addr;
     ignored_data.size = region->size;
     ignored_data.data = malloc(region->size);
     // TODO, we should do this once per privatization segment:
-    MC_process_read(snapshot->process,
-      MC_ADDRESS_SPACE_READ_FLAGS_NONE,
-      ignored_data.data, region->addr, region->size, MC_PROCESS_INDEX_DISABLED);
+    snapshot->process->read_bytes(
+      ignored_data.data, region->size, remote(region->addr),
+      simgrid::mc::ProcessIndexDisabled);
     xbt_dynar_push(snapshot->ignored_data, &ignored_data);
   }
 
   // Zero the memory:
-  xbt_dynar_foreach (mc_model_checker->process.checkpoint_ignore, cursor, region) {
+  xbt_dynar_foreach (mc_model_checker->process().checkpoint_ignore, cursor, region) {
     MC_process_clear_memory(snapshot->process, region->addr, region->size);
   }
 
@@ -616,25 +606,6 @@ static void MC_snapshot_ignore_restore(mc_snapshot_t snapshot)
   }
 }
 
-/** @brief Can we remove this snapshot?
- *
- * Some snapshots cannot be removed (yet) because we need them
- * at this point.
- *
- * @param snapshot
- */
-int mc_important_snapshot(mc_snapshot_t snapshot)
-{
-  // We need this snapshot in order to know which
-  // pages needs to be stored in the next snapshot.
-  // This field is only non-NULL when using soft-dirty
-  // page tracking.
-  if (snapshot == mc_model_checker->parent_snapshot)
-    return true;
-
-  return false;
-}
-
 static void MC_get_current_fd(mc_snapshot_t snapshot)
 {
 
@@ -716,20 +687,16 @@ static void MC_get_current_fd(mc_snapshot_t snapshot)
   closedir (fd_dir);
 }
 
-static s_mc_address_space_class_t mc_snapshot_class = {
-  .read = (mc_address_space_class_read_callback_t) &MC_snapshot_read,
-  .get_process = NULL
-};
-
 mc_snapshot_t MC_take_snapshot(int num_state)
 {
   XBT_DEBUG("Taking snapshot %i", num_state);
 
-  mc_process_t mc_process = &mc_model_checker->process;
-  mc_snapshot_t snapshot = xbt_new0(s_mc_snapshot_t, 1);
+  mc_process_t mc_process = &mc_model_checker->process();
+
+  mc_snapshot_t snapshot = new simgrid::mc::Snapshot();
+
   snapshot->process = mc_process;
   snapshot->num_state = num_state;
-  snapshot->address_space.address_space_class = &mc_snapshot_class;
 
   snapshot->enabled_processes = xbt_dynar_new(sizeof(int), NULL);
 
@@ -817,7 +784,7 @@ void MC_restore_snapshot(mc_snapshot_t snapshot)
   if (_sg_mc_snapshot_fds)
     MC_restore_snapshot_fds(snapshot);
   MC_snapshot_ignore_restore(snapshot);
-  mc_model_checker->process.cache_flags = 0;
+  mc_model_checker->process().cache_flags = 0;
 }
 
 mc_snapshot_t simcall_HANDLER_mc_snapshot(smx_simcall_t simcall)