From db93bfcc458411f563c4cb4569a6ef26e6f710e8 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sun, 19 Mar 2023 10:58:20 +0100 Subject: [PATCH] Remove some more usage of mc_model_checker in Region and snapshoting logic --- src/mc/sosp/Region.cpp | 9 ++++----- src/mc/sosp/Region.hpp | 4 ++-- src/mc/sosp/Snapshot.cpp | 20 +++++++++++--------- src/mc/sosp/Snapshot.hpp | 7 ++++--- src/mc/sosp/Snapshot_test.cpp | 18 +++++++++--------- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/mc/sosp/Region.cpp b/src/mc/sosp/Region.cpp index 538e12f3ea..f8161c3aa5 100644 --- a/src/mc/sosp/Region.cpp +++ b/src/mc/sosp/Region.cpp @@ -17,20 +17,19 @@ namespace simgrid::mc { -Region::Region(PageStore& store, RegionType region_type, void* start_addr, size_t size) +Region::Region(PageStore& store, RemoteProcessMemory& memory, RegionType region_type, void* start_addr, size_t size) : region_type_(region_type), start_addr_(start_addr), size_(size) { xbt_assert((((uintptr_t)start_addr) & (xbt_pagesize - 1)) == 0, "Start address not at the beginning of a page"); - chunks_ = ChunkedData(store, mc_model_checker->get_remote_process_memory(), RemotePtr(start_addr), - mmu::chunk_count(size)); + chunks_ = ChunkedData(store, memory, RemotePtr(start_addr), mmu::chunk_count(size)); } /** @brief Restore a region from a snapshot * * @param region Target region */ -void Region::restore() const +void Region::restore(RemoteProcessMemory& memory) const { xbt_assert(((start().address()) & (xbt_pagesize - 1)) == 0, "Not at the beginning of a page"); xbt_assert(simgrid::mc::mmu::chunk_count(size()) == get_chunks().page_count()); @@ -38,7 +37,7 @@ void Region::restore() const for (size_t i = 0; i != get_chunks().page_count(); ++i) { auto* target_page = (void*)simgrid::mc::mmu::join(i, (std::uintptr_t)(void*)start().address()); const void* source_page = get_chunks().page(i); - mc_model_checker->get_remote_process_memory().write_bytes(source_page, xbt_pagesize, remote(target_page)); + memory.write_bytes(source_page, xbt_pagesize, remote(target_page)); } } diff --git a/src/mc/sosp/Region.hpp b/src/mc/sosp/Region.hpp index 01af81cadf..cf7b748577 100644 --- a/src/mc/sosp/Region.hpp +++ b/src/mc/sosp/Region.hpp @@ -35,7 +35,7 @@ private: ChunkedData chunks_; public: - Region(PageStore& store, RegionType type, void* start_addr, size_t size); + Region(PageStore& store, RemoteProcessMemory& memory, RegionType type, void* start_addr, size_t size); Region(Region const&) = delete; Region& operator=(Region const&) = delete; Region(Region&& that) = delete; @@ -58,7 +58,7 @@ public: bool contain(RemotePtr p) const { return p >= start() && p < end(); } /** @brief Restore a region from a snapshot */ - void restore() const; + void restore(RemoteProcessMemory& memory) const; /** @brief Read memory that was snapshotted in this region * diff --git a/src/mc/sosp/Snapshot.cpp b/src/mc/sosp/Snapshot.cpp index 7d9caba33a..366a7e3af9 100644 --- a/src/mc/sosp/Snapshot.cpp +++ b/src/mc/sosp/Snapshot.cpp @@ -13,19 +13,20 @@ namespace simgrid::mc { /************************************* Take Snapshot ************************************/ /****************************************************************************************/ -void Snapshot::snapshot_regions(RemoteProcessMemory& process_memory) +void Snapshot::snapshot_regions(RemoteProcessMemory& memory) { snapshot_regions_.clear(); - for (auto const& object_info : process_memory.object_infos) - add_region(RegionType::Data, object_info.get(), object_info->start_rw, object_info->end_rw - object_info->start_rw); + for (auto const& object_info : memory.object_infos) + add_region(RegionType::Data, memory, object_info.get(), object_info->start_rw, + object_info->end_rw - object_info->start_rw); - const s_xbt_mheap_t* heap = process_memory.get_heap(); + const s_xbt_mheap_t* heap = memory.get_heap(); void* start_heap = heap->base; void* end_heap = heap->breakval; - add_region(RegionType::Heap, nullptr, start_heap, (char*)end_heap - (char*)start_heap); - heap_bytes_used_ = mmalloc_get_bytes_used_remote(heap->heaplimit, process_memory.get_malloc_info()); + add_region(RegionType::Heap, memory, nullptr, start_heap, (char*)end_heap - (char*)start_heap); + heap_bytes_used_ = mmalloc_get_bytes_used_remote(heap->heaplimit, memory.get_malloc_info()); } /** @brief Checks whether the variable is in scope for a given IP. @@ -217,14 +218,15 @@ Snapshot::Snapshot(long num_state, PageStore& store, RemoteProcessMemory& memory ignore_restore(); } -void Snapshot::add_region(RegionType type, ObjectInformation* object_info, void* start_addr, std::size_t size) +void Snapshot::add_region(RegionType type, RemoteProcessMemory& memory, ObjectInformation* object_info, + void* start_addr, std::size_t size) { if (type == RegionType::Data) xbt_assert(object_info, "Missing object info for object."); else if (type == RegionType::Heap) xbt_assert(not object_info, "Unexpected object info for heap region."); - auto* region = new Region(page_store_, type, start_addr, size); + auto* region = new Region(page_store_, memory, type, start_addr, size); region->object_info(object_info); snapshot_regions_.push_back(std::unique_ptr(region)); } @@ -276,7 +278,7 @@ void Snapshot::restore(RemoteProcessMemory& memory) const // Restore regions for (std::unique_ptr const& region : snapshot_regions_) { - region->restore(); + region->restore(memory); } ignore_restore(); diff --git a/src/mc/sosp/Snapshot.hpp b/src/mc/sosp/Snapshot.hpp index d584bdf3ce..6fde410c71 100644 --- a/src/mc/sosp/Snapshot.hpp +++ b/src/mc/sosp/Snapshot.hpp @@ -90,9 +90,10 @@ public: std::vector ignored_data_; private: - void add_region(RegionType type, ObjectInformation* object_info, void* start_addr, std::size_t size); - void snapshot_regions(RemoteProcessMemory& process_memory); - void snapshot_stacks(RemoteProcessMemory& process_memory); + void add_region(RegionType type, RemoteProcessMemory& memory, ObjectInformation* object_info, void* start_addr, + std::size_t size); + void snapshot_regions(RemoteProcessMemory& memory); + void snapshot_stacks(RemoteProcessMemory& memory); void handle_ignore(); void ignore_restore() const; hash_type do_hash() const; diff --git a/src/mc/sosp/Snapshot_test.cpp b/src/mc/sosp/Snapshot_test.cpp index 662c7a1cee..974ad35d51 100644 --- a/src/mc/sosp/Snapshot_test.cpp +++ b/src/mc/sosp/Snapshot_test.cpp @@ -39,12 +39,9 @@ public: delete mc_model_checker; mc_model_checker = nullptr; } - - static std::unique_ptr process; }; // static member variables init. -std::unique_ptr snap_test_helper::process = nullptr; simgrid::mc::PageStore snap_test_helper::page_store_(500); void snap_test_helper::init_memory(void* mem, size_t size) @@ -60,9 +57,9 @@ void snap_test_helper::Init() REQUIRE(xbt_pagesize == getpagesize()); REQUIRE(1 << xbt_pagebits == xbt_pagesize); - process = std::make_unique(getpid()); - process->init(nullptr); - mc_model_checker = new ::simgrid::mc::ModelChecker(std::move(process)); + auto memory = std::make_unique(getpid()); + memory->init(nullptr); + mc_model_checker = new ::simgrid::mc::ModelChecker(std::move(memory)); } snap_test_helper::prologue_return snap_test_helper::prologue(int n) @@ -75,11 +72,13 @@ snap_test_helper::prologue_return snap_test_helper::prologue(int n) // Init memory and take snapshots: init_memory(source, byte_size); - auto* region0 = new simgrid::mc::Region(page_store_, simgrid::mc::RegionType::Data, source, byte_size); + auto* region0 = new simgrid::mc::Region(page_store_, mc_model_checker->get_remote_process_memory(), + simgrid::mc::RegionType::Data, source, byte_size); for (int i = 0; i < n; i += 2) { init_memory((char*)source + i * xbt_pagesize, xbt_pagesize); } - auto* region = new simgrid::mc::Region(page_store_, simgrid::mc::RegionType::Data, source, byte_size); + auto* region = new simgrid::mc::Region(page_store_, mc_model_checker->get_remote_process_memory(), + simgrid::mc::RegionType::Data, source, byte_size); void* destination = mmap(nullptr, byte_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); INFO("Could not allocate destination memory"); @@ -161,7 +160,8 @@ void snap_test_helper::read_pointer() { prologue_return ret = prologue(1); memcpy(ret.src, &mc_model_checker, sizeof(void*)); - const simgrid::mc::Region region2(page_store_, simgrid::mc::RegionType::Data, ret.src, ret.size); + const simgrid::mc::Region region2(page_store_, mc_model_checker->get_remote_process_memory(), + simgrid::mc::RegionType::Data, ret.src, ret.size); INFO("Mismtach in MC_region_read_pointer()"); REQUIRE(MC_region_read_pointer(®ion2, ret.src) == mc_model_checker); -- 2.20.1