+static xbt_dynar_t MC_take_snapshot_ignore(){
+
+ if(mc_heap_comparison_ignore == NULL)
+ return NULL;
+
+ xbt_dynar_t cpy = xbt_dynar_new(sizeof(mc_heap_ignore_region_t), heap_ignore_region_free_voidp);
+
+ unsigned int cursor = 0;
+ mc_heap_ignore_region_t current_region;
+
+ xbt_dynar_foreach(mc_heap_comparison_ignore, cursor, current_region){
+ mc_heap_ignore_region_t new_region = NULL;
+ new_region = xbt_new0(s_mc_heap_ignore_region_t, 1);
+ new_region->address = current_region->address;
+ new_region->size = current_region->size;
+ new_region->block = current_region->block;
+ new_region->fragment = current_region->fragment;
+ xbt_dynar_push(cpy, &new_region);
+ }
+
+ return cpy;
+
+}
+
+static void MC_dump_checkpoint_ignore(mc_snapshot_t snapshot){
+
+ unsigned int cursor = 0;
+ mc_checkpoint_ignore_region_t region;
+ size_t offset;
+
+ xbt_dynar_foreach(mc_checkpoint_ignore, cursor, region){
+ if(region->addr > snapshot->regions[0]->start_addr && (char *)(region->addr) < (char *)snapshot->regions[0]->start_addr + STD_HEAP_SIZE){
+ offset = (char *)region->addr - (char *)snapshot->regions[0]->start_addr;
+ memset((char *)snapshot->regions[0]->data + offset, 0, region->size);
+ }else if(region->addr > snapshot->regions[2]->start_addr && (char *)(region->addr) < (char*)snapshot->regions[2]->start_addr + snapshot->regions[2]->size){
+ offset = (char *)region->addr - (char *)snapshot->regions[2]->start_addr;
+ memset((char *)snapshot->regions[2]->data + offset, 0, region->size);
+ }else if(region->addr > snapshot->regions[1]->start_addr && (char *)(region->addr) < (char*)snapshot->regions[1]->start_addr + snapshot->regions[1]->size){
+ offset = (char *)region->addr - (char *)snapshot->regions[1]->start_addr;
+ memset((char *)snapshot->regions[1]->data + offset, 0, region->size);
+ }
+ }
+
+}
+
+
+mc_snapshot_t MC_take_snapshot(int num_state){
+
+ mc_snapshot_t snapshot = xbt_new0(s_mc_snapshot_t, 1);
+ snapshot->nb_processes = xbt_swag_size(simix_global->process_list);
+
+ /* Save the std heap and the writable mapped pages of libsimgrid and binary */
+ MC_get_memory_regions(snapshot);
+
+ snapshot->to_ignore = MC_take_snapshot_ignore();
+
+ if(_sg_mc_visited > 0 || strcmp(_sg_mc_property_file,"")){
+ snapshot->stacks = MC_take_snapshot_stacks(&snapshot, snapshot->regions[0]->data);
+ if(_sg_mc_hash && snapshot->stacks!=NULL) {
+ snapshot->hash = mc_hash_processes_state(num_state, snapshot->stacks);
+ } else {
+ snapshot->hash = 0;
+ }
+ }
+ else {
+ snapshot->hash = 0;
+ }
+
+ if(num_state > 0)
+ MC_dump_checkpoint_ignore(snapshot);
+
+ return snapshot;
+
+}
+
+void MC_restore_snapshot(mc_snapshot_t snapshot){