X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/96cedde3cdbc0b8ffc3f096a1b65d021b0226f99..b923f24fcb86571011626426f577fe6322094bb3:/src/mc/sosp/RegionSnapshot.cpp diff --git a/src/mc/sosp/RegionSnapshot.cpp b/src/mc/sosp/RegionSnapshot.cpp index ea2445ffe2..f86a2f3c03 100644 --- a/src/mc/sosp/RegionSnapshot.cpp +++ b/src/mc/sosp/RegionSnapshot.cpp @@ -22,82 +22,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_RegionSnaphot, mc, "Logging specific to regio namespace simgrid { namespace mc { -static inline const char* to_cstr(RegionType region) -{ - switch (region) { - case RegionType::Unknown: - return "unknown"; - case RegionType::Heap: - return "Heap"; - case RegionType::Data: - return "Data"; - default: - return "?"; - } -} - -Buffer::Buffer(std::size_t size, Type type) : size_(size), type_(type) -{ - switch (type_) { - case Type::Malloc: - data_ = ::operator new(size_); - break; - case Type::Mmap: - data_ = ::mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0); - if (data_ == MAP_FAILED) { - data_ = nullptr; - size_ = 0; - type_ = Type::Malloc; - throw std::bad_alloc(); - } - break; - default: - abort(); - } -} - -void Buffer::clear() noexcept -{ - switch (type_) { - case Type::Malloc: - ::operator delete(data_); - break; - case Type::Mmap: - if (munmap(data_, size_) != 0) - abort(); - break; - default: - abort(); - } - data_ = nullptr; - size_ = 0; - type_ = Type::Malloc; -} - RegionSnapshot dense_region(RegionType region_type, void* start_addr, void* permanent_addr, size_t size) { - // When KSM support is enables, we allocate memory using mmap: - // * we don't want to advise bits of the heap as mergable - // * mmap gives data aligned on page boundaries which is merge friendly - simgrid::mc::Buffer data; - if (_sg_mc_ksm) - data = Buffer::mmap(size); - else - data = Buffer::malloc(size); + simgrid::mc::Buffer data = Buffer::malloc(size); mc_model_checker->process().read_bytes(data.get(), size, remote(permanent_addr), simgrid::mc::ProcessIndexDisabled); -#ifdef __linux__ - if (_sg_mc_ksm) - // Mark the region as mergeable *after* we have written into it. - // Trying to merge them before is useless/counterproductive. - madvise(data.get(), size, MADV_MERGEABLE); -#endif - simgrid::mc::RegionSnapshot region(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", to_cstr(region_type), + 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); return region; } @@ -123,9 +58,10 @@ RegionSnapshot sparse_region(RegionType region_type, void* start_addr, void* per simgrid::mc::RemoteClient* process = &mc_model_checker->process(); assert(process != nullptr); - xbt_assert((((uintptr_t)start_addr) & (xbt_pagesize - 1)) == 0, "Not at the beginning of a page"); - xbt_assert((((uintptr_t)permanent_addr) & (xbt_pagesize - 1)) == 0, "Not at the beginning of a page"); - size_t page_count = simgrid::mc::mmu::chunkCount(size); + xbt_assert((((uintptr_t)start_addr) & (xbt_pagesize - 1)) == 0, "Start address not at the beginning of a page"); + xbt_assert((((uintptr_t)permanent_addr) & (xbt_pagesize - 1)) == 0, + "Permanent address not at the beginning of a page"); + size_t page_count = simgrid::mc::mmu::chunk_count(size); simgrid::mc::ChunkedData page_data(mc_model_checker->page_store(), *process, RemotePtr(permanent_addr), page_count);