From bd11e68e17f60d1516d80ce8f8c7319542a15ae6 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Fri, 17 Jul 2015 11:50:15 +0200 Subject: [PATCH] [mc] Cleanup/C++ification of {ModelChecker,PageStore}.{c,h}pp --- src/mc/ModelChecker.hpp | 8 +++--- src/mc/PageStore.cpp | 42 +++++++++++++++-------------- src/mc/PageStore.hpp | 59 +++++++++++++++++++---------------------- 3 files changed, 53 insertions(+), 56 deletions(-) diff --git a/src/mc/ModelChecker.hpp b/src/mc/ModelChecker.hpp index fe50841917..8ef6f807b4 100644 --- a/src/mc/ModelChecker.hpp +++ b/src/mc/ModelChecker.hpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include "mc_forward.h" #include "mc_process.h" @@ -32,14 +32,14 @@ class ModelChecker { // TODO, use std::unordered_set with heterogeneous comparison lookup (C++14) xbt_dict_t /* */ hostnames_; // This is the parent snapshot of the current state: - s_mc_pages_store_t page_store_; - s_mc_process_t process_; + PageStore page_store_; + Process process_; public: ModelChecker(ModelChecker const&) = delete; ModelChecker& operator=(ModelChecker const&) = delete; ModelChecker(pid_t pid, int socket); ~ModelChecker(); - s_mc_process_t& process() + Process& process() { return process_; } diff --git a/src/mc/PageStore.cpp b/src/mc/PageStore.cpp index e8c74acd65..5be3176ac4 100644 --- a/src/mc/PageStore.cpp +++ b/src/mc/PageStore.cpp @@ -36,12 +36,12 @@ namespace mc { static inline __attribute__ ((always_inline)) PageStore::hash_type mc_hash_page(const void* data) { - const uint64_t* values = (const uint64_t*) data; - size_t n = xbt_pagesize / sizeof(uint64_t); + const std::uint64_t* values = (const uint64_t*) data; + std::size_t n = xbt_pagesize / sizeof(uint64_t); // This djb2: - uint64_t hash = 5381; - for (size_t i=0; i!=n; ++i) { + std::uint64_t hash = 5381; + for (std::size_t i = 0; i != n; ++i) { hash = ((hash << 5) + hash) + values[i]; } return hash; @@ -55,8 +55,8 @@ PageStore::PageStore(size_t size) : // Using mmap in order to be able to expand the region // by relocating it somewhere else in the virtual memory // space: - void * memory = ::mmap(NULL, size << xbt_pagebits, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, -1, 0); - if (memory==MAP_FAILED) { + void* memory = ::mmap(NULL, size << xbt_pagebits, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_POPULATE, -1, 0); + if (memory == MAP_FAILED) { xbt_die("Could not mmap initial snapshot pages."); } @@ -71,7 +71,7 @@ PageStore::~PageStore() ::munmap(this->memory_, this->capacity_ << xbt_pagebits); } -void PageStore::resize(size_t size) +void PageStore::resize(std::size_t size) { size_t old_bytesize = this->capacity_ << xbt_pagebits; size_t new_bytesize = size << xbt_pagebits; @@ -92,7 +92,7 @@ void PageStore::resize(size_t size) * * @return index of the free page */ -size_t PageStore::alloc_page() +std::size_t PageStore::alloc_page() { if (this->free_pages_.empty()) { @@ -115,7 +115,7 @@ size_t PageStore::alloc_page() } } -void PageStore::remove_page(size_t pageno) +void PageStore::remove_page(std::size_t pageno) { this->free_pages_.push_back(pageno); const void* page = this->get_page(pageno); @@ -124,7 +124,7 @@ void PageStore::remove_page(size_t pageno) } /** Store a page in memory */ -size_t PageStore::store_page(void* page) +std::size_t PageStore::store_page(void* page) { xbt_assert(top_index_ <= this->capacity_, "top_index is not consistent"); @@ -151,7 +151,7 @@ size_t PageStore::store_page(void* page) // Otherwise, a new page is allocated in the page store and the content // of the page is `memcpy()`-ed to this new page. - size_t pageno = alloc_page(); + std::size_t pageno = alloc_page(); xbt_assert(this->page_counts_[pageno]==0, "Allocated page is already used"); void* snapshot_page = (void*) this->get_page(pageno); memcpy(snapshot_page, page, xbt_pagesize); @@ -165,9 +165,9 @@ size_t PageStore::store_page(void* page) #ifdef SIMGRID_TEST -#include -#include -#include +#include +#include + #include #include @@ -177,9 +177,9 @@ size_t PageStore::store_page(void* page) static int value = 0; -static void new_content(void* data, size_t size) +static void new_content(void* data, std::size_t size) { - memset(data, ++value, size); + ::memset(data, ++value, size); } static void* getpage() @@ -193,10 +193,12 @@ XBT_TEST_SUITE("mc_page_store", "Page store"); XBT_TEST_UNIT("base", test_mc_page_store, "Test adding/removing pages in the store") { + using simgrid::mc::PageStore; + xbt_test_add("Init"); - size_t pagesize = (size_t) getpagesize(); - std::unique_ptr store - = std::unique_ptr(new simgrid::mc::PageStore(500)); + std::size_t pagesize = (size_t) getpagesize(); + std::unique_ptr store + = std::unique_ptr(new simgrid::mc::PageStore(500)); void* data = getpage(); xbt_test_assert(store->size()==0, "Bad size"); @@ -205,7 +207,7 @@ XBT_TEST_UNIT("base", test_mc_page_store, "Test adding/removing pages in the sto size_t pageno1 = store->store_page(data); xbt_test_assert(store->get_ref(pageno1)==1, "Bad refcount"); const void* copy = store->get_page(pageno1); - xbt_test_assert(memcmp(data, copy, pagesize)==0, "Page data should be the same"); + xbt_test_assert(::memcmp(data, copy, pagesize)==0, "Page data should be the same"); xbt_test_assert(store->size()==1, "Bad size"); xbt_test_add("Store the same page again"); diff --git a/src/mc/PageStore.hpp b/src/mc/PageStore.hpp index 9296a324a7..9e72f1d27a 100644 --- a/src/mc/PageStore.hpp +++ b/src/mc/PageStore.hpp @@ -7,17 +7,12 @@ #ifndef SIMGRID_MC_PAGESTORE_HPP #define SIMGRID_MC_PAGESTORE_HPP -#include - +#include #include -#include -#include #include #include -#include - #include "mc_mmu.h" #include "mc_forward.h" @@ -78,40 +73,37 @@ namespace mc { */ class PageStore { public: // Types - typedef uint64_t hash_type; + typedef std::uint64_t hash_type; private: // Types // We are using a cheap hash to index a page. // We should expect collision and we need to associate multiple page indices // to the same hash. - typedef boost::unordered_set page_set_type; + typedef boost::unordered_set page_set_type; typedef boost::unordered_map pages_map_type; private: // Fields: - /** First page - * - * mc_page_store_get_page expects that this is the first field. - * */ + /** First page */ void* memory_; /** Number of available pages in virtual memory */ - size_t capacity_; + std::size_t capacity_; /** Top of the used pages (index of the next available page) */ - size_t top_index_; + std::size_t top_index_; /** Page reference count */ - std::vector page_counts_; + std::vector page_counts_; /** Index of available pages before the top */ - std::vector free_pages_; + std::vector free_pages_; /** Index from page hash to page index */ pages_map_type hash_index_; private: // Methods - void resize(size_t size); - size_t alloc_page(); - void remove_page(size_t pageno); + void resize(std::size_t size); + std::size_t alloc_page(); + void remove_page(std::size_t pageno); public: // Constructors PageStore(PageStore const&) = delete; PageStore& operator=(PageStore const&) = delete; - explicit PageStore(size_t size); + explicit PageStore(std::size_t size); ~PageStore(); public: // Methods @@ -125,7 +117,7 @@ public: // Methods * it is added to the `free_pages_` list and removed from the `hash_index_`. * * */ - void unref_page(size_t pageno); + void unref_page(std::size_t pageno); /** @brief Increment the refcount for a given page * @@ -147,43 +139,45 @@ public: // Methods * @param Number of the memory page in the store * @return Start of the page */ - const void* get_page(size_t pageno) const; + const void* get_page(std::size_t pageno) const; public: // Debug/test methods /** @brief Get the number of references for a page */ - size_t get_ref(size_t pageno); + std::size_t get_ref(std::size_t pageno); /** @brief Get the number of used pages */ - size_t size(); + std::size_t size(); /** @brief Get the capacity of the page store * * The capacity is expanded by a system call (mremap). * */ - size_t capacity(); + std::size_t capacity(); }; inline __attribute__((always_inline)) -void PageStore::unref_page(size_t pageno) { - if ((--this->page_counts_[pageno]) == 0) { +void PageStore::unref_page(std::size_t pageno) { + if ((--this->page_counts_[pageno]) == 0) this->remove_page(pageno); - } } inline __attribute__((always_inline)) -void PageStore::ref_page(size_t pageno) { +void PageStore::ref_page(size_t pageno) +{ ++this->page_counts_[pageno]; } inline __attribute__((always_inline)) -const void* PageStore::get_page(size_t pageno) const { +const void* PageStore::get_page(std::size_t pageno) const +{ return mc_page_from_number(this->memory_, pageno); } inline __attribute__((always_inline)) -size_t PageStore::get_ref(size_t pageno) { +std::size_t PageStore::get_ref(std::size_t pageno) +{ return this->page_counts_[pageno]; } @@ -193,7 +187,8 @@ size_t PageStore::size() { } inline __attribute__((always_inline)) -size_t PageStore::capacity() { +std::size_t PageStore::capacity() +{ return this->capacity_; } -- 2.20.1