- size_t page_count = mc_page_count(size);
-
- uint64_t* pagemap = NULL;
- if (_sg_mc_soft_dirty && mc_model_checker->parent_snapshot) {
- pagemap = (uint64_t*) mmalloc_no_memset(mc_heap, sizeof(uint64_t) * page_count);
- mc_read_pagemap(pagemap, mc_page_number(NULL, permanent_addr), page_count);
- }
-
- size_t* reg_page_numbers = NULL;
- if (ref_reg!=NULL && ref_reg->storage_type == MC_REGION_STORAGE_TYPE_CHUNKED)
- reg_page_numbers = ref_reg->chunked.page_numbers;
-
- // Take incremental snapshot:
- region->chunked.page_numbers = mc_take_page_snapshot_region(
- permanent_addr, page_count, pagemap, reg_page_numbers);
-
- if(pagemap) {
- mfree(mc_heap, pagemap);
- }
- return region;
-}
-
-void mc_region_restore_sparse(mc_mem_region_t reg, mc_mem_region_t ref_reg)
-{
- xbt_assert((((uintptr_t)reg->permanent_addr) & (xbt_pagesize-1)) == 0,
- "Not at the beginning of a page");
- size_t page_count = mc_page_count(reg->size);
-
- uint64_t* pagemap = NULL;
-
- // Read soft-dirty bits if necessary in order to know which pages have changed:
- if (_sg_mc_soft_dirty && mc_model_checker->parent_snapshot) {
- pagemap = (uint64_t*) mmalloc_no_memset(mc_heap, sizeof(uint64_t) * page_count);
- mc_read_pagemap(pagemap, mc_page_number(NULL, reg->permanent_addr), page_count);
- }
-
- // Incremental per-page snapshot restoration:s
- size_t* reg_page_numbers = NULL;
- if (ref_reg && ref_reg->storage_type == MC_REGION_STORAGE_TYPE_CHUNKED)
- reg_page_numbers = ref_reg->chunked.page_numbers;
-
- mc_restore_page_snapshot_region(reg->permanent_addr, page_count, reg->chunked.page_numbers,
- pagemap, reg_page_numbers);
-
- if(pagemap) {
- free(pagemap);
- }