From 2a07cc1dc95048c86a3fc76aca2e9c088f7b5025 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Tue, 21 May 2019 00:29:22 +0200 Subject: [PATCH] RegionSnap: only use pointers to regions for sake of simplicity --- src/mc/sosp/RegionSnapshot.cpp | 16 ++++++++-------- src/mc/sosp/RegionSnapshot.hpp | 8 ++++---- src/mc/sosp/mc_checkpoint.cpp | 8 ++++---- src/mc/sosp/mc_snapshot.cpp | 6 +++--- src/mc/sosp/mc_snapshot_test.cpp | 32 +++++++++++++++++++++----------- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/mc/sosp/RegionSnapshot.cpp b/src/mc/sosp/RegionSnapshot.cpp index f86a2f3c03..a657ea0774 100644 --- a/src/mc/sosp/RegionSnapshot.cpp +++ b/src/mc/sosp/RegionSnapshot.cpp @@ -22,18 +22,18 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_RegionSnaphot, mc, "Logging specific to regio namespace simgrid { namespace mc { -RegionSnapshot dense_region(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) +RegionSnapshot* dense_region(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) { simgrid::mc::Buffer data = Buffer::malloc(size); mc_model_checker->process().read_bytes(data.get(), size, remote(permanent_addr), simgrid::mc::ProcessIndexDisabled); - simgrid::mc::RegionSnapshot region(region_type, start_addr, permanent_addr, size); - region.flat_data(std::move(data)); + simgrid::mc::RegionSnapshot* region = new RegionSnapshot(region_type, start_addr, permanent_addr, size); + region->flat_data(std::move(data)); XBT_DEBUG("New region : type : %s, data : %p (real addr %p), size : %zu", (region_type == RegionType::Heap ? "Heap" : (region_type == RegionType::Data ? "Data" : "?")), - region.flat_data().get(), permanent_addr, size); + region->flat_data().get(), permanent_addr, size); return region; } @@ -45,7 +45,7 @@ RegionSnapshot dense_region(RegionType region_type, void* start_addr, void* perm * privatized mapping) * @param size Size of the data* */ -RegionSnapshot region(RegionType type, void* start_addr, void* permanent_addr, size_t size) +RegionSnapshot* region(RegionType type, void* start_addr, void* permanent_addr, size_t size) { if (_sg_mc_sparse_checkpoint) return sparse_region(type, start_addr, permanent_addr, size); @@ -53,7 +53,7 @@ RegionSnapshot region(RegionType type, void* start_addr, void* permanent_addr, s return dense_region(type, start_addr, permanent_addr, size); } -RegionSnapshot sparse_region(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) +RegionSnapshot* sparse_region(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) { simgrid::mc::RemoteClient* process = &mc_model_checker->process(); assert(process != nullptr); @@ -66,8 +66,8 @@ RegionSnapshot sparse_region(RegionType region_type, void* start_addr, void* per simgrid::mc::ChunkedData page_data(mc_model_checker->page_store(), *process, RemotePtr(permanent_addr), page_count); - simgrid::mc::RegionSnapshot region(region_type, start_addr, permanent_addr, size); - region.page_data(std::move(page_data)); + simgrid::mc::RegionSnapshot* region = new RegionSnapshot(region_type, start_addr, permanent_addr, size); + region->page_data(std::move(page_data)); return region; } diff --git a/src/mc/sosp/RegionSnapshot.hpp b/src/mc/sosp/RegionSnapshot.hpp index 87996d774b..5869ba68f6 100644 --- a/src/mc/sosp/RegionSnapshot.hpp +++ b/src/mc/sosp/RegionSnapshot.hpp @@ -230,10 +230,10 @@ public: bool contain(RemotePtr p) const { return p >= start() && p < end(); } }; -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); -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); +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); +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 diff --git a/src/mc/sosp/mc_checkpoint.cpp b/src/mc/sosp/mc_checkpoint.cpp index e614bd3cb4..760a0c225b 100644 --- a/src/mc/sosp/mc_checkpoint.cpp +++ b/src/mc/sosp/mc_checkpoint.cpp @@ -85,7 +85,7 @@ static void restore(RegionSnapshot* region) } #if HAVE_SMPI -RegionSnapshot privatized_region(RegionType region_type, void* start_addr, void* permanent_addr, std::size_t size) +RegionSnapshot* privatized_region(RegionType region_type, void* start_addr, void* permanent_addr, std::size_t size) { size_t process_count = MC_smpi_process_count(); @@ -101,10 +101,10 @@ RegionSnapshot privatized_region(RegionType region_type, void* start_addr, void* data.reserve(process_count); for (size_t i = 0; i < process_count; i++) data.push_back(std::unique_ptr( - new RegionSnapshot(region(region_type, start_addr, privatization_regions[i].address, size)))); + region(region_type, start_addr, privatization_regions[i].address, size))); - RegionSnapshot reg = RegionSnapshot(region_type, start_addr, permanent_addr, size); - reg.privatized_data(std::move(data)); + RegionSnapshot* reg = new RegionSnapshot(region_type, start_addr, permanent_addr, size); + reg->privatized_data(std::move(data)); return reg; } #endif diff --git a/src/mc/sosp/mc_snapshot.cpp b/src/mc/sosp/mc_snapshot.cpp index 4b58752b7f..da489b9abb 100644 --- a/src/mc/sosp/mc_snapshot.cpp +++ b/src/mc/sosp/mc_snapshot.cpp @@ -118,7 +118,7 @@ void Snapshot::add_region(RegionType type, ObjectInformation* object_info, void* else if (type == simgrid::mc::RegionType::Heap) xbt_assert(not object_info, "Unexpected object info for heap region."); - simgrid::mc::RegionSnapshot region; + simgrid::mc::RegionSnapshot* region; #if HAVE_SMPI const bool privatization_aware = object_info && mc_model_checker->process().privatized(*object_info); if (privatization_aware && MC_smpi_process_count()) @@ -127,8 +127,8 @@ void Snapshot::add_region(RegionType type, ObjectInformation* object_info, void* #endif region = simgrid::mc::region(type, start_addr, permanent_addr, size); - region.object_info(object_info); - snapshot_regions_.push_back(std::unique_ptr(new RegionSnapshot(std::move(region)))); + region->object_info(object_info); + snapshot_regions_.push_back(std::unique_ptr(std::move(region))); } const void* Snapshot::read_bytes(void* buffer, std::size_t size, RemotePtr address, int process_index, diff --git a/src/mc/sosp/mc_snapshot_test.cpp b/src/mc/sosp/mc_snapshot_test.cpp index ef1591c8fa..80a73570aa 100644 --- a/src/mc/sosp/mc_snapshot_test.cpp +++ b/src/mc/sosp/mc_snapshot_test.cpp @@ -26,8 +26,8 @@ public: size_t size; void* src; void* dstn; - RegionSnapshot region0; - RegionSnapshot region; + RegionSnapshot* region0; + RegionSnapshot* region; } prologue_return; static prologue_return prologue(int n); // common to the below 5 fxs static void read_whole_region(); @@ -81,12 +81,12 @@ snap_test_helper::prologue_return snap_test_helper::prologue(int n) // Init memory and take snapshots: init_memory(source, byte_size); - simgrid::mc::RegionSnapshot region0 = + simgrid::mc::RegionSnapshot* region0 = simgrid::mc::sparse_region(simgrid::mc::RegionType::Unknown, source, source, byte_size); for (int i = 0; i < n; i += 2) { init_memory((char*)source + i * xbt_pagesize, xbt_pagesize); } - simgrid::mc::RegionSnapshot region = + simgrid::mc::RegionSnapshot* region = simgrid::mc::sparse_region(simgrid::mc::RegionType::Unknown, source, source, byte_size); void* destination = mmap(nullptr, byte_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); @@ -105,12 +105,14 @@ void snap_test_helper::read_whole_region() for (int n = 1; n != 32; ++n) { prologue_return ret = prologue(n); - const void* read = MC_region_read(&(ret.region), ret.dstn, ret.src, ret.size); + const void* read = MC_region_read(ret.region, ret.dstn, ret.src, ret.size); INFO("Mismatch in MC_region_read()"); REQUIRE(not memcmp(ret.src, read, ret.size)); munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); + delete ret.region0; + delete ret.region; } } @@ -123,12 +125,14 @@ void snap_test_helper::read_region_parts() for (int j = 0; j != 100; ++j) { size_t offset = rnd_engine() % ret.size; size_t size = rnd_engine() % (ret.size - offset); - const void* read = MC_region_read(&(ret.region), ret.dstn, (const char*)ret.src + offset, size); + const void* read = MC_region_read(ret.region, ret.dstn, (const char*)ret.src + offset, size); INFO("Mismatch in MC_region_read()"); REQUIRE(not memcmp((char*)ret.src + offset, read, size)); } munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); + delete ret.region0; + delete ret.region; } } @@ -139,10 +143,12 @@ void snap_test_helper::compare_whole_region() prologue_return ret = prologue(n); INFO("Unexpected match in MC_snapshot_region_memcmp() with previous snapshot"); - REQUIRE(MC_snapshot_region_memcmp(ret.src, &(ret.region0), ret.src, &(ret.region), ret.size)); + REQUIRE(MC_snapshot_region_memcmp(ret.src, ret.region0, ret.src, ret.region, ret.size)); munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); + delete ret.region0; + delete ret.region; } } @@ -157,11 +163,13 @@ void snap_test_helper::compare_region_parts() size_t size = rnd_engine() % (ret.size - offset); INFO("Mismatch in MC_snapshot_region_memcmp()"); - REQUIRE(not MC_snapshot_region_memcmp((char*)ret.src + offset, &(ret.region), (char*)ret.src + offset, - &(ret.region), size)); + REQUIRE(not MC_snapshot_region_memcmp((char*)ret.src + offset, ret.region, (char*)ret.src + offset, ret.region, + size)); } munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); + delete ret.region0; + delete ret.region; } } @@ -170,13 +178,15 @@ void snap_test_helper::read_pointer() prologue_return ret = prologue(1); memcpy(ret.src, &mc_model_checker, sizeof(void*)); - simgrid::mc::RegionSnapshot region2 = + simgrid::mc::RegionSnapshot* region2 = simgrid::mc::sparse_region(simgrid::mc::RegionType::Unknown, ret.src, ret.src, ret.size); INFO("Mismtach in MC_region_read_pointer()"); - REQUIRE(MC_region_read_pointer(®ion2, ret.src) == mc_model_checker); + REQUIRE(MC_region_read_pointer(region2, ret.src) == mc_model_checker); munmap(ret.dstn, ret.size); munmap(ret.src, ret.size); + delete ret.region0; + delete ret.region; } /*************** End: class snap_test_helper *****************************/ -- 2.20.1