X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/aabd69e2ec25a7e7e1b6e3d7d86f531c42f4fca9..9575359fcebd3a393b65891c293990d1a882eb34:/src/mc/PageStore.cpp diff --git a/src/mc/PageStore.cpp b/src/mc/PageStore.cpp index 9b196b8cde..a8e149aeb4 100644 --- a/src/mc/PageStore.cpp +++ b/src/mc/PageStore.cpp @@ -5,11 +5,18 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include -#include // memcpy, memcp +#include // memcpy, memcmp #include +#ifdef __FreeBSD__ +# define MAP_POPULATE MAP_PREFAULT_READ +#endif -#include +#include +#include +#include + +#include "src/internal_config.h" #include "src/mc/PageStore.hpp" @@ -21,7 +28,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_page_snapshot, mc, namespace simgrid { namespace mc { -/** @brief Compte a hash for the given memory page +/** @brief Compute a hash for the given memory page * * The page is used before inserting the page in the page store * in order to find duplicate of this page in the page store. @@ -29,8 +36,7 @@ namespace mc { * @param data Memory page * @return hash off the page */ -static inline __attribute__ ((always_inline)) -PageStore::hash_type mc_hash_page(const void* data) +static XBT_ALWAYS_INLINE PageStore::hash_type mc_hash_page(const void* data) { const std::uint64_t* values = (const uint64_t*) data; std::size_t n = xbt_pagesize / sizeof(uint64_t); @@ -69,12 +75,46 @@ void PageStore::resize(std::size_t size) { size_t old_bytesize = this->capacity_ << xbt_pagebits; size_t new_bytesize = size << xbt_pagebits; + void *new_memory; // Expand the memory region by moving it into another // virtual memory address if necessary: - void* new_memory = mremap(this->memory_, old_bytesize, new_bytesize, MREMAP_MAYMOVE); +#if HAVE_MREMAP + new_memory = mremap(this->memory_, old_bytesize, new_bytesize, MREMAP_MAYMOVE); if (new_memory == MAP_FAILED) xbt_die("Could not mremap snapshot pages."); +#else + if (new_bytesize > old_bytesize) { + // Grow: first try to add new space after current map + new_memory = mmap((char *)this->memory_ + old_bytesize, + new_bytesize-old_bytesize, + PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, + -1, 0); + if (new_memory == MAP_FAILED) + xbt_die("Could not mremap snapshot pages."); + // Check if expanding worked + if (new_memory != (char *)this->memory_ + old_bytesize) { + // New memory segment could not be put at the end of this->memory_, + // so cancel this one and try to rellocate everything and copy data + munmap(new_memory, new_bytesize-old_bytesize); + new_memory = mmap(nullptr, + new_bytesize, + PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, + -1, 0); + if (new_memory == MAP_FAILED) + xbt_die("Could not mremap snapshot pages."); + memcpy(new_memory, this->memory_, old_bytesize); + munmap(this->memory_, old_bytesize); + } + } + else { + // We don't have functions to shrink a mapping, so leave memory as + // it is for now + new_memory = this->memory_; + } +#endif this->capacity_ = size; this->memory_ = new_memory;