+namespace simgrid {
+namespace mc {
+
+Snapshot::Snapshot() :
+ process(nullptr),
+ num_state(0),
+ heap_bytes_used(0),
+ snapshot_regions(nullptr),
+ snapshot_regions_count(0),
+ enabled_processes(),
+ privatization_index(0),
+ stack_sizes(),
+ stacks(nullptr),
+ to_ignore(nullptr),
+ hash(0),
+ ignored_data(nullptr),
+ total_fd(0),
+ current_fd(nullptr)
+{
+
+}
+Snapshot::~Snapshot()
+{
+ for (size_t i = 0; i < this->snapshot_regions_count; i++) {
+ delete this->snapshot_regions[i];
+ }
+ xbt_free(this->snapshot_regions);
+ xbt_dynar_free(&(this->stacks));
+ xbt_dynar_free(&(this->to_ignore));
+ xbt_dynar_free(&this->ignored_data);
+}
+
+const void* Snapshot::read_bytes(void* buffer, std::size_t size,
+ remote_ptr<void> address, int process_index,
+ AddressSpace::ReadMode mode) const
+{
+ mc_mem_region_t region = mc_get_snapshot_region((void*)address.address(), this, process_index);
+ if (region) {
+ const void* res = MC_region_read(region, buffer, (void*)address.address(), size);
+ if (buffer == res || mode == AddressSpace::Lazy)
+ return res;
+ else {
+ memcpy(buffer, res, size);
+ return buffer;
+ }
+ }
+ else
+ return this->read_bytes(buffer, size, address, process_index, mode);
+}
+
+}
+}
+