X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/573a49afcc1a146f9776a7a772d87efd9db77657..b66d5e3048f03720a020e09f507db4d8a96a4798:/src/mc/mc_checkpoint.cpp diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index d420aa9aee..559504af95 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -45,32 +45,23 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_checkpoint, mc, /************************************ Free functions **************************************/ /*****************************************************************************************/ -static void MC_snapshot_stack_free(mc_snapshot_stack_t s) +s_mc_snapshot_stack::~s_mc_snapshot_stack() { - if (s) { - xbt_dynar_free(&(s->local_variables)); - xbt_dynar_free(&(s->stack_frames)); - mc_unw_destroy_context(s->context); - xbt_free(s->context); - xbt_free(s); - } + xbt_dynar_free(&(this->stack_frames)); + mc_unw_destroy_context(this->context); + xbt_free(this->context); } static void MC_snapshot_stack_free_voidp(void *s) { mc_snapshot_stack_t stack = (mc_snapshot_stack_t) * (void **) s; - MC_snapshot_stack_free(stack); -} - -static void local_variable_free(local_variable_t v) -{ - xbt_free(v->name); - xbt_free(v); + delete stack; } static void local_variable_free_voidp(void *v) { - local_variable_free((local_variable_t) * (void **) v); + local_variable_t var = *(local_variable_t*)v; + delete var; } } @@ -165,17 +156,16 @@ static void MC_snapshot_add_region(int index, mc_snapshot_t snapshot, region.object_info(object_info); snapshot->snapshot_regions[index] - = new simgrid::mc::RegionSnapshot(std::move(region)); + = std::unique_ptr( + new simgrid::mc::RegionSnapshot(std::move(region))); return; } static void MC_get_memory_regions(mc_process_t process, mc_snapshot_t snapshot) { const size_t n = process->object_infos_size; - snapshot->snapshot_regions_count = n + 1; - snapshot->snapshot_regions = xbt_new0(mc_mem_region_t, n + 1); - - for (size_t i = 0; i!=n; ++i) { + snapshot->snapshot_regions.resize(n + 1); + for (size_t i = 0; i != n; ++i) { mc_object_info_t object_info = process->object_infos[i]; MC_snapshot_add_region(i, snapshot, simgrid::mc::RegionType::Data, object_info, object_info->start_rw, object_info->start_rw, @@ -285,7 +275,8 @@ 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) + dw_frame_t scope, int process_index, + std::vector& result) { mc_process_t process = &mc_model_checker->process(); @@ -307,15 +298,16 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame, else region_type = 2; - local_variable_t new_var = xbt_new0(s_local_variable_t, 1); - new_var->subprogram = stack_frame->frame; - new_var->ip = stack_frame->ip; - new_var->name = xbt_strdup(current_variable->name); - new_var->type = current_variable->type; - new_var->region = region_type; + s_local_variable_t new_var; + new_var.subprogram = stack_frame->frame; + new_var.ip = stack_frame->ip; + new_var.name = current_variable->name; + new_var.type = current_variable->type; + new_var.region = region_type; + new_var.address = nullptr; if (current_variable->address != NULL) { - new_var->address = current_variable->address; + new_var.address = current_variable->address; } else if (current_variable->locations.size != 0) { s_mc_location_t location; mc_dwarf_resolve_locations( @@ -327,7 +319,7 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame, switch(mc_get_location_type(&location)) { case MC_LOCATION_TYPE_ADDRESS: - new_var->address = location.memory_location; + new_var.address = location.memory_location; break; case MC_LOCATION_TYPE_REGISTER: default: @@ -338,7 +330,7 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame, xbt_die("No address"); } - xbt_dynar_push(result, &new_var); + result.push_back(std::move(new_var)); } // Recursive processing of nested scopes: @@ -348,28 +340,23 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame, } } -static xbt_dynar_t MC_get_local_variables_values(xbt_dynar_t stack_frames, int process_index) +static std::vector MC_get_local_variables_values(xbt_dynar_t stack_frames, int process_index) { unsigned cursor1 = 0; mc_stack_frame_t stack_frame; - xbt_dynar_t variables = - xbt_dynar_new(sizeof(local_variable_t), local_variable_free_voidp); + std::vector variables; xbt_dynar_foreach(stack_frames, cursor1, stack_frame) { mc_fill_local_variables_values(stack_frame, stack_frame->frame, process_index, variables); } - - return variables; + return std::move(variables); } static void MC_stack_frame_free_voipd(void *s) { mc_stack_frame_t stack_frame = *(mc_stack_frame_t *) s; - if (stack_frame) { - xbt_free(stack_frame->frame_name); - xbt_free(stack_frame); - } + delete(stack_frame); } static xbt_dynar_t MC_unwind_stack_frames(mc_unw_context_t stack_context) @@ -388,7 +375,7 @@ static xbt_dynar_t MC_unwind_stack_frames(mc_unw_context_t stack_context) } else while (1) { - mc_stack_frame_t stack_frame = xbt_new(s_mc_stack_frame_t, 1); + mc_stack_frame_t stack_frame = new s_mc_stack_frame_t(); xbt_dynar_push(result, &stack_frame); stack_frame->unw_cursor = c; @@ -407,12 +394,12 @@ static xbt_dynar_t MC_unwind_stack_frames(mc_unw_context_t stack_context) stack_frame->frame = frame; if (frame) { - stack_frame->frame_name = xbt_strdup(frame->name); + stack_frame->frame_name = frame->name; stack_frame->frame_base = (unw_word_t) mc_find_frame_base(frame, frame->object_info, &c); } else { stack_frame->frame_base = 0; - stack_frame->frame_name = NULL; + stack_frame->frame_name = std::string(); } /* Stop before context switch with maestro */ @@ -448,7 +435,7 @@ static xbt_dynar_t MC_take_snapshot_stacks(mc_snapshot_t * snapshot) // FIXME, cross-process support (stack_areas) xbt_dynar_foreach(stacks_areas, cursor, current_stack) { - mc_snapshot_stack_t st = xbt_new(s_mc_snapshot_stack_t, 1); + mc_snapshot_stack_t st = new s_mc_snapshot_stack(); // Read the context from remote process: unw_context_t context; @@ -651,11 +638,10 @@ mc_snapshot_t MC_take_snapshot(int num_state) static inline void MC_restore_snapshot_regions(mc_snapshot_t snapshot) { - const size_t n = snapshot->snapshot_regions_count; - for (size_t i = 0; i < n; i++) { + for(std::unique_ptr const& region : snapshot->snapshot_regions) { // For privatized, variables we decided it was not necessary to take the snapshot: - if (snapshot->snapshot_regions[i]) - MC_region_restore(snapshot->snapshot_regions[i]); + if (region) + MC_region_restore(region.get()); } #ifdef HAVE_SMPI