X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/16f843b808b321508679187eae65e1fec3cf14ee..72680ab46a46b8f1ae2dbfb56581968206f4e3b1:/src/mc/mc_checkpoint.c diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index e482c42aa4..eb4cfd348e 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -12,6 +12,7 @@ #include "mc_private.h" #include "xbt/module.h" #include +#include "../smpi/private.h" #include "xbt/mmalloc/mmprivate.h" @@ -53,6 +54,7 @@ static void local_variable_free_voidp(void *v){ static void MC_region_destroy(mc_mem_region_t reg) { + //munmap(reg->data, reg->size); xbt_free(reg->data); xbt_free(reg); } @@ -65,6 +67,15 @@ void MC_free_snapshot(mc_snapshot_t snapshot){ xbt_free(snapshot->stack_sizes); xbt_dynar_free(&(snapshot->stacks)); xbt_dynar_free(&(snapshot->to_ignore)); + + if(snapshot->privatization_regions){ + size_t n = snapshot->nb_processes; + for(i=0; i!=n; ++i) { + MC_region_destroy(snapshot->privatization_regions[i]); + } + xbt_free(snapshot->privatization_regions); + } + xbt_free(snapshot); } @@ -77,8 +88,12 @@ static mc_mem_region_t MC_region_new(int type, void *start_addr, size_t size) mc_mem_region_t new_reg = xbt_new(s_mc_mem_region_t, 1); new_reg->start_addr = start_addr; new_reg->size = size; + //new_reg->data = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + //if(new_reg->data==MAP_FAILED) + //xbt_die("Could not mmap new memory for snapshot."); new_reg->data = xbt_malloc(size); memcpy(new_reg->data, start_addr, size); + //madvise(new_reg->data, size, MADV_MERGEABLE); XBT_DEBUG("New region : type : %d, data : %p (real addr %p), size : %zu", type, new_reg->data, start_addr, size); @@ -102,6 +117,7 @@ static void MC_snapshot_add_region(mc_snapshot_t snapshot, int type, void *start } static void MC_get_memory_regions(mc_snapshot_t snapshot){ + size_t i; void* start_heap = ((xbt_mheap_t)std_heap)->base; void* end_heap = ((xbt_mheap_t)std_heap)->breakval; @@ -109,7 +125,17 @@ static void MC_get_memory_regions(mc_snapshot_t snapshot){ snapshot->heap_bytes_used = mmalloc_get_bytes_used(std_heap); MC_snapshot_add_region(snapshot, 1, mc_libsimgrid_info->start_rw, mc_libsimgrid_info->end_rw - mc_libsimgrid_info->start_rw); - MC_snapshot_add_region(snapshot, 2, mc_binary_info->start_rw, mc_binary_info->end_rw - mc_binary_info->start_rw); + if(!smpi_privatize_global_variables) { + MC_snapshot_add_region(snapshot, 2, mc_binary_info->start_rw, mc_binary_info->end_rw - mc_binary_info->start_rw); + snapshot->privatization_regions = NULL; + snapshot->privatization_index = -1; + } else { + snapshot->privatization_regions = xbt_new(mc_mem_region_t, SIMIX_process_count()); + for (i=0; i< SIMIX_process_count(); i++){ + snapshot->privatization_regions[i] = MC_region_new(-1, mappings[i], size_data_exe); + } + snapshot->privatization_index = loaded_page; + } } /** @brief Finds the range of the different memory segments and binary paths */ @@ -245,9 +271,9 @@ void MC_find_object_address(memory_map_t maps, mc_object_info_t result) { * \param ip Instruction pointer * \return true if the variable is valid * */ -static bool mc_valid_variable(dw_variable_t var, dw_frame_t frame, const void* ip) { +static bool mc_valid_variable(dw_variable_t var, dw_frame_t scope, const void* ip) { // The variable is not yet valid: - if((const void*)((const char*) frame->low_pc + var->start_scope) > ip) + if((const void*)((const char*) scope->low_pc + var->start_scope) > ip) return false; else return true; @@ -262,7 +288,7 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame, dw_fram dw_variable_t current_variable; xbt_dynar_foreach(scope->variables, cursor, current_variable){ - if(!mc_valid_variable(current_variable, stack_frame->frame, (void*) stack_frame->ip)) + if(!mc_valid_variable(current_variable, scope, (void*) stack_frame->ip)) continue; int region_type; @@ -278,13 +304,15 @@ static void mc_fill_local_variables_values(mc_stack_frame_t stack_frame, dw_fram new_var->type = current_variable->type; new_var->region= region_type; - /* if(current_variable->address!=NULL) { + if(current_variable->address!=NULL) { new_var->address = current_variable->address; - } else */ + } else if(current_variable->locations.size != 0){ new_var->address = (void*) mc_dwarf_resolve_locations(¤t_variable->locations, current_variable->object_info, &(stack_frame->unw_cursor), (void*)stack_frame->frame_base, NULL); + } else { + xbt_die("No address"); } xbt_dynar_push(result, &new_var); @@ -472,6 +500,13 @@ mc_snapshot_t MC_take_snapshot(int num_state){ if(num_state > 0) MC_dump_checkpoint_ignore(snapshot); + // mprotect the region after zero-ing ignored parts: + /*size_t i; + for(i=0; i!=NB_REGIONS; ++i) { + mc_mem_region_t region = snapshot->regions[i]; + mprotect(region->data, region->size, PROT_READ); + }*/ + return snapshot; } @@ -479,9 +514,19 @@ mc_snapshot_t MC_take_snapshot(int num_state){ void MC_restore_snapshot(mc_snapshot_t snapshot){ unsigned int i; for(i=0; i < NB_REGIONS; i++){ - MC_region_restore(snapshot->regions[i]); + // For privatized, variables we decided it was not necessary to take the snapshot: + if(snapshot->regions[i]) + MC_region_restore(snapshot->regions[i]); } + if(snapshot->privatization_regions) { + for (i=0; i< SIMIX_process_count(); i++){ + if(snapshot->privatization_regions[i]) { + MC_region_restore(snapshot->privatization_regions[i]); + } + } + switch_data_segment(snapshot->privatization_index); + } } void* mc_translate_address(uintptr_t addr, mc_snapshot_t snapshot) {