snapshot->privatization_regions =
xbt_new(mc_mem_region_t, SIMIX_process_count());
for (i = 0; i < SIMIX_process_count(); i++) {
- // TODO, add support for sparse snapshot
+ mc_mem_region_t ref_reg =
+ mc_model_checker->parent_snapshot ? mc_model_checker->parent_snapshot->privatization_regions[i] : NULL;
snapshot->privatization_regions[i] =
- MC_region_new(-1, mappings[i], size_data_exe, NULL);
+ MC_region_new(-1, mappings[i], size_data_exe, ref_reg);
}
snapshot->privatization_index = loaded_page;
}
return result;
};
-static xbt_dynar_t MC_take_snapshot_stacks(mc_snapshot_t * snapshot, void *heap)
+static xbt_dynar_t MC_take_snapshot_stacks(mc_snapshot_t * snapshot)
{
xbt_dynar_t res =
/* Save the std heap and the writable mapped pages of libsimgrid and binary */
MC_get_memory_regions(snapshot);
- if (_sg_mc_sparse_checkpoint) {
+ if (_sg_mc_sparse_checkpoint && _sg_mc_soft_dirty) {
mc_softdirty_reset();
}
if (_sg_mc_visited > 0 || strcmp(_sg_mc_property_file, "")) {
snapshot->stacks =
- MC_take_snapshot_stacks(&snapshot, snapshot->regions[0]->data);
+ MC_take_snapshot_stacks(&snapshot);
if (_sg_mc_hash && snapshot->stacks != NULL) {
snapshot->hash = mc_hash_processes_state(num_state, snapshot->stacks);
} else {
switch_data_segment(snapshot->privatization_index);
}
- MC_snapshot_ignore_restore(snapshot);
- if (_sg_mc_sparse_checkpoint) {
+ if (_sg_mc_sparse_checkpoint && _sg_mc_soft_dirty) {
mc_softdirty_reset();
}
+
+ MC_snapshot_ignore_restore(snapshot);
mc_model_checker->parent_snapshot = snapshot;
}