From 9616e469135a02323c3ca9d9e60e5a2e4958efbf Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Mon, 8 Jun 2015 12:07:14 +0200 Subject: [PATCH 1/1] [mc] Make Snapshot::ignored_data a std::vector --- src/mc/mc_checkpoint.cpp | 23 +++++++---------------- src/mc/mc_snapshot.cpp | 5 ++--- src/mc/mc_snapshot.h | 5 ++--- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index 29a631822d..51b9e586f2 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -504,27 +504,20 @@ static xbt_dynar_t MC_take_snapshot_ignore() } -static void mc_free_snapshot_ignored_data_pvoid(void* data) { - mc_snapshot_ignored_data_t ignored_data = (mc_snapshot_ignored_data_t) data; - free(ignored_data->data); -} - static void MC_snapshot_handle_ignore(mc_snapshot_t snapshot) { xbt_assert(snapshot->process); - snapshot->ignored_data = xbt_dynar_new(sizeof(s_mc_snapshot_ignored_data_t), mc_free_snapshot_ignored_data_pvoid); - + // Copy the memory: for (auto const& region : mc_model_checker->process().ignored_regions()) { s_mc_snapshot_ignored_data_t ignored_data; ignored_data.start = (void*)region.addr; - ignored_data.size = region.size; - ignored_data.data = malloc(region.size); + ignored_data.data.resize(region.size); // TODO, we should do this once per privatization segment: snapshot->process->read_bytes( - ignored_data.data, region.size, remote(region.addr), + ignored_data.data.data(), region.size, remote(region.addr), simgrid::mc::ProcessIndexDisabled); - xbt_dynar_push(snapshot->ignored_data, &ignored_data); + snapshot->ignored_data.push_back(std::move(ignored_data)); } // Zero the memory: @@ -536,12 +529,10 @@ static void MC_snapshot_handle_ignore(mc_snapshot_t snapshot) static void MC_snapshot_ignore_restore(mc_snapshot_t snapshot) { - unsigned int cursor = 0; - s_mc_snapshot_ignored_data_t ignored_data; - xbt_dynar_foreach (snapshot->ignored_data, cursor, ignored_data) { - snapshot->process->write_bytes(ignored_data.data, ignored_data.size, + for (auto const& ignored_data : snapshot->ignored_data) + snapshot->process->write_bytes( + ignored_data.data.data(), ignored_data.data.size(), remote(ignored_data.start)); - } } static std::vector MC_get_current_fds(pid_t pid) diff --git a/src/mc/mc_snapshot.cpp b/src/mc/mc_snapshot.cpp index 35276ca016..ce9b138c04 100644 --- a/src/mc/mc_snapshot.cpp +++ b/src/mc/mc_snapshot.cpp @@ -164,11 +164,11 @@ Snapshot::Snapshot() : stack_sizes(), stacks(nullptr), to_ignore(nullptr), - hash(0), - ignored_data(nullptr) + hash(0) { } + Snapshot::~Snapshot() { for (size_t i = 0; i < this->snapshot_regions_count; i++) { @@ -177,7 +177,6 @@ Snapshot::~Snapshot() 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, diff --git a/src/mc/mc_snapshot.h b/src/mc/mc_snapshot.h index b860dd954a..0bb55bceb0 100644 --- a/src/mc/mc_snapshot.h +++ b/src/mc/mc_snapshot.h @@ -84,8 +84,7 @@ XBT_INTERNAL mc_mem_region_t mc_get_snapshot_region( * */ typedef struct s_mc_snapshot_ignored_data { void* start; - size_t size; - void* data; + std::vector data; } s_mc_snapshot_ignored_data_t, *mc_snapshot_ignored_data_t; typedef struct s_fd_infos{ @@ -149,7 +148,7 @@ public: // To be private xbt_dynar_t stacks; xbt_dynar_t to_ignore; uint64_t hash; - xbt_dynar_t ignored_data; + std::vector ignored_data; std::vector current_fds; }; -- 2.20.1