// Compare the global variables separately for each simulates process:
for (size_t i = 0; i < process_count; i++) {
- if (compare_global_variables(state, object_info, i, &r1->privatized_data()[i], &r2->privatized_data()[i],
- snapshot1, snapshot2))
+ if (compare_global_variables(state, object_info, i, r1->privatized_data()[i].get(),
+ r2->privatized_data()[i].get(), snapshot1, snapshot2))
return 1;
}
return 0;
Buffer flat_data_;
ChunkedData page_numbers_;
- std::vector<RegionSnapshot> privatized_regions_;
+ std::vector<std::unique_ptr<RegionSnapshot>> privatized_regions_;
public:
RegionSnapshot() {}
}
ChunkedData const& page_data() const { return page_numbers_; }
- void privatized_data(std::vector<RegionSnapshot> data)
+ void privatized_data(std::vector<std::unique_ptr<RegionSnapshot>> data)
{
storage_type_ = StorageType::Privatized;
flat_data_.clear();
page_numbers_.clear();
privatized_regions_ = std::move(data);
}
- std::vector<RegionSnapshot> const& privatized_data() const { return privatized_regions_; }
- std::vector<RegionSnapshot>& privatized_data() { return privatized_regions_; }
+ std::vector<std::unique_ptr<RegionSnapshot>> const& privatized_data() const { return privatized_regions_; }
+ std::vector<std::unique_ptr<RegionSnapshot>>& privatized_data() { return privatized_regions_; }
simgrid::mc::ObjectInformation* object_info() const { return object_info_; }
void object_info(simgrid::mc::ObjectInformation* info) { object_info_ = info; }
RegionSnapshot privatized_region(RegionType region_type, void* start_addr, void* permanent_addr, std::size_t size);
RegionSnapshot dense_region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
-simgrid::mc::RegionSnapshot sparse_region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
-simgrid::mc::RegionSnapshot region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
+RegionSnapshot sparse_region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
+RegionSnapshot region(RegionType type, void* start_addr, void* data_addr, std::size_t size);
} // namespace mc
} // namespace simgrid
case simgrid::mc::StorageType::Privatized:
for (auto& p : region->privatized_data())
- restore(&p);
+ restore(p.get());
break;
default: // includes StorageType::NoData
mc_model_checker->process().read_bytes(&privatization_regions, sizeof(privatization_regions),
remote(remote_smpi_privatization_regions));
- std::vector<RegionSnapshot> data;
+ std::vector<std::unique_ptr<RegionSnapshot>> data;
data.reserve(process_count);
for (size_t i = 0; i < process_count; i++)
- data.push_back(region(region_type, start_addr, privatization_regions[i].address, size));
+ data.push_back(std::unique_ptr<simgrid::mc::RegionSnapshot>(
+ new RegionSnapshot(region(region_type, start_addr, privatization_regions[i].address, size))));
- RegionSnapshot region = RegionSnapshot(region_type, start_addr, permanent_addr, size);
- region.privatized_data(std::move(data));
- return region;
+ RegionSnapshot reg = RegionSnapshot(region_type, start_addr, permanent_addr, size);
+ reg.privatized_data(std::move(data));
+ return reg;
}
#endif
snapshot->add_region(simgrid::mc::RegionType::Heap, nullptr, start_heap, start_heap,
(char*)end_heap - (char*)start_heap);
snapshot->heap_bytes_used_ = mmalloc_get_bytes_used_remote(heap->heaplimit, process->get_malloc_info());
+ snapshot->privatization_index_ = simgrid::mc::ProcessIndexMissing;
#if HAVE_SMPI
if (mc_model_checker->process().privatized() && MC_smpi_process_count())
// snapshot->privatization_index = smpi_loaded_page
mc_model_checker->process().read_variable("smpi_loaded_page", &snapshot->privatization_index_,
sizeof(snapshot->privatization_index_));
- else
#endif
- snapshot->privatization_index_ = simgrid::mc::ProcessIndexMissing;
}
/** @brief Fills the position of the segments (executable, read-only, read/write).
xbt_assert(process_index >= 0, "Missing process index");
xbt_assert(process_index < (int)region->privatized_data().size(), "Invalid process index");
- RegionSnapshot& priv_region = region->privatized_data()[process_index];
- xbt_assert(priv_region.contain(simgrid::mc::remote(addr)));
- return &priv_region;
+ RegionSnapshot* priv_region = region->privatized_data()[process_index].get();
+ xbt_assert(priv_region->contain(simgrid::mc::remote(addr)));
+ return priv_region;
#else
xbt_die("Privatized region in a non SMPI build (this should not happen)");
#endif
case simgrid::mc::StorageType::Privatized: {
xbt_assert(process_index >= 0, "Missing process index for privatized region");
xbt_assert((size_t)process_index < region->privatized_data().size(), "Out of range process index");
- simgrid::mc::RegionSnapshot& subregion = region->privatized_data()[process_index];
- return mc_translate_address_region(addr, &subregion, process_index);
+ simgrid::mc::RegionSnapshot* subregion = region->privatized_data()[process_index].get();
+ return mc_translate_address_region(addr, subregion, process_index);
}
default: // includes StorageType::NoData
xbt_die("Storage type not supported");