X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/706dd4584b4002e0d948b81d103dd5c4b70db077..f9436b840852218b39dce22d6057b6f223168daa:/src/mc/PageStore.cpp diff --git a/src/mc/PageStore.cpp b/src/mc/PageStore.cpp index f8bb9bff65..a8e149aeb4 100644 --- a/src/mc/PageStore.cpp +++ b/src/mc/PageStore.cpp @@ -8,11 +8,16 @@ #include // memcpy, memcmp #include +#ifdef __FreeBSD__ +# define MAP_POPULATE MAP_PREFAULT_READ +#endif #include #include #include +#include "src/internal_config.h" + #include "src/mc/PageStore.hpp" #include "src/mc/mc_mmu.h" @@ -31,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); @@ -71,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;