From: Gabriel Corona Date: Fri, 17 Apr 2015 12:32:43 +0000 (+0200) Subject: [mc] C++ class PageStore X-Git-Tag: v3_12~732^2~53 X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/0ef1caaf350ac106b3431e8afb4246aace1b44d2 [mc] C++ class PageStore --- diff --git a/.gitignore b/.gitignore index 973db9cab7..a3bc4683c6 100644 --- a/.gitignore +++ b/.gitignore @@ -1057,7 +1057,7 @@ examples/smpi/mc/smpi_non_deterministic examples/smpi/mc/smpi_send_deterministic simgrid.jar_finalized simgrid_full.jar -src/mc_page_store_unit.cpp +src/PageStore_unit.cpp src/bindings/java/MANIFEST.MF NATIVE/ VERSION diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 83cce2052e..b08922fe1f 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -6,7 +6,7 @@ set(EXTRA_DIST src/include/mc/datatypes.h src/include/mc/mc.h src/mc/mc_mmu.h - src/mc/mc_page_store.h + src/mc/PageStore.hpp src/mc/mc_record.h src/include/simgrid/platf_interface.h src/include/simgrid/sg_config.h @@ -605,8 +605,8 @@ set(MC_SRC src/mc/mc_checkpoint.cpp src/mc/mc_snapshot.h src/mc/mc_snapshot.cpp - src/mc/mc_page_store.h - src/mc/mc_page_store.cpp + src/mc/PageStore.hpp + src/mc/PageStore.cpp src/mc/mc_page_snapshot.cpp src/mc/mc_comm_pattern.h src/mc/mc_comm_pattern.cpp diff --git a/buildtools/Cmake/UnitTesting.cmake b/buildtools/Cmake/UnitTesting.cmake index 411ff08131..2435bf64ef 100644 --- a/buildtools/Cmake/UnitTesting.cmake +++ b/buildtools/Cmake/UnitTesting.cmake @@ -30,11 +30,11 @@ set(TEST_UNITS if(HAVE_MC) set(TEST_CFILES ${TEST_CFILES} - src/mc/mc_page_store.cpp + src/mc/PageStore.cpp src/mc/mc_snapshot.cpp ) set(TEST_UNITS ${TEST_UNITS} - ${CMAKE_CURRENT_BINARY_DIR}/src/mc_page_store_unit.cpp + ${CMAKE_CURRENT_BINARY_DIR}/src/PageStore_unit.cpp ${CMAKE_CURRENT_BINARY_DIR}/src/mc_snapshot_unit.cpp ) endif() diff --git a/src/mc/ModelChecker.cpp b/src/mc/ModelChecker.cpp index 061ca74d19..1c3b76af25 100644 --- a/src/mc/ModelChecker.cpp +++ b/src/mc/ModelChecker.cpp @@ -7,7 +7,7 @@ #include #include "ModelChecker.hpp" -#include "mc_page_store.h" +#include "PageStore.hpp" ::simgrid::mc::ModelChecker* mc_model_checker = NULL; @@ -15,18 +15,14 @@ namespace simgrid { namespace mc { ModelChecker::ModelChecker(pid_t pid, int socket) + : page_store_(500) { - this->page_store_ = mc_pages_store_new(); - this->fd_clear_refs_ = -1; this->hostnames_ = xbt_dict_new(); MC_process_init(&this->process(), pid, socket); } ModelChecker::~ModelChecker() { - mc_pages_store_delete(this->page_store_); - if(this->record_) - xbt_dynar_free(&this->record_); MC_process_clear(&this->process_); xbt_dict_free(&this->hostnames_); } diff --git a/src/mc/ModelChecker.hpp b/src/mc/ModelChecker.hpp index 5fb8204411..b88c39ff8b 100644 --- a/src/mc/ModelChecker.hpp +++ b/src/mc/ModelChecker.hpp @@ -14,7 +14,7 @@ #include "mc_forward.h" #include "mc_process.h" -#include "mc_page_store.h" +#include "PageStore.hpp" #include "mc_protocol.h" namespace simgrid { @@ -29,9 +29,7 @@ namespace mc { */ class ModelChecker { // This is the parent snapshot of the current state: - mc_pages_store_t page_store_; - int fd_clear_refs_; - xbt_dynar_t record_; + s_mc_pages_store_t page_store_; s_mc_process_t process_; /** String pool for host names */ // TODO, use std::unordered_set with heterogeneous comparison lookup (C++14) @@ -45,9 +43,9 @@ public: { return process_; } - s_mc_pages_store_t& page_store() + PageStore& page_store() { - return *page_store_; + return page_store_; } const char* get_host_name(const char* name); }; diff --git a/src/mc/mc_page_store.cpp b/src/mc/PageStore.cpp similarity index 91% rename from src/mc/mc_page_store.cpp rename to src/mc/PageStore.cpp index db4bc051b6..2935004ed1 100644 --- a/src/mc/mc_page_store.cpp +++ b/src/mc/PageStore.cpp @@ -13,7 +13,7 @@ #include -#include "mc_page_store.h" +#include "PageStore.hpp" #ifdef MC_PAGE_STORE_MD4 #include @@ -26,7 +26,8 @@ extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_page_snapshot, mc, "Logging specific to mc_page_snapshot"); -// ***** Utility: +namespace simgrid { +namespace mc { /** @brief Compte a hash for the given memory page * @@ -37,7 +38,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_page_snapshot, mc, * @return hash off the page */ static inline __attribute__ ((always_inline)) -s_mc_pages_store::hash_type mc_hash_page(const void* data) +PageStore::hash_type mc_hash_page(const void* data) { #ifdef MC_PAGE_STORE_MD4 boost::array result; @@ -61,7 +62,7 @@ s_mc_pages_store::hash_type mc_hash_page(const void* data) // ***** snapshot_page_manager -s_mc_pages_store::s_mc_pages_store(size_t size) : +PageStore::PageStore(size_t size) : memory_(NULL), capacity_(0), top_index_(0) { // Using mmap in order to be able to expand the region @@ -78,12 +79,12 @@ s_mc_pages_store::s_mc_pages_store(size_t size) : this->page_counts_.resize(size); } -s_mc_pages_store::~s_mc_pages_store() +PageStore::~PageStore() { ::munmap(this->memory_, this->capacity_ << xbt_pagebits); } -void s_mc_pages_store::resize(size_t size) +void PageStore::resize(size_t size) { size_t old_bytesize = this->capacity_ << xbt_pagebits; size_t new_bytesize = size << xbt_pagebits; @@ -104,7 +105,7 @@ void s_mc_pages_store::resize(size_t size) * * @return index of the free page */ -size_t s_mc_pages_store::alloc_page() +size_t PageStore::alloc_page() { if (this->free_pages_.empty()) { @@ -127,7 +128,7 @@ size_t s_mc_pages_store::alloc_page() } } -void s_mc_pages_store::remove_page(size_t pageno) +void PageStore::remove_page(size_t pageno) { this->free_pages_.push_back(pageno); const void* page = this->get_page(pageno); @@ -140,7 +141,7 @@ void s_mc_pages_store::remove_page(size_t pageno) } /** Store a page in memory */ -size_t s_mc_pages_store::store_page(void* page) +size_t PageStore::store_page(void* page) { xbt_assert(top_index_ <= this->capacity_, "top_index is not consistent"); @@ -192,20 +193,7 @@ size_t s_mc_pages_store::store_page(void* page) return pageno; } -// ***** Main C API - -extern "C" { - -mc_pages_store_t mc_pages_store_new() -{ - return new s_mc_pages_store_t(500); } - -void mc_pages_store_delete(mc_pages_store_t store) -{ - delete store; -} - } #ifdef SIMGRID_TEST @@ -218,7 +206,7 @@ void mc_pages_store_delete(mc_pages_store_t store) #include -#include "mc/mc_page_store.h" +#include "mc/PageStore.hpp" static int value = 0; @@ -240,7 +228,8 @@ XBT_TEST_UNIT("base", test_mc_page_store, "Test adding/removing pages in the sto { xbt_test_add("Init"); size_t pagesize = (size_t) getpagesize(); - std::unique_ptr store = std::unique_ptr(new s_mc_pages_store(500)); + std::unique_ptr store + = std::unique_ptr(new simgrid::mc::PageStore(500)); void* data = getpage(); xbt_test_assert(store->size()==0, "Bad size"); diff --git a/src/mc/mc_page_store.h b/src/mc/PageStore.hpp similarity index 88% rename from src/mc/mc_page_store.h rename to src/mc/PageStore.hpp index 2f79705354..4e09ab7676 100644 --- a/src/mc/mc_page_store.h +++ b/src/mc/PageStore.hpp @@ -23,9 +23,8 @@ #ifndef MC_PAGE_STORE_H #define MC_PAGE_STORE_H -struct s_mc_pages_store; - -#ifdef __cplusplus +namespace simgrid { +namespace mc { /** @brief Storage for snapshot memory pages * @@ -79,7 +78,7 @@ struct s_mc_pages_store; * we must be able to store multiple indices for the same hash. * */ -struct s_mc_pages_store { +class PageStore { public: // Types #ifdef MC_PAGE_STORE_MD4 typedef boost::array hash_type; @@ -123,8 +122,10 @@ private: // Methods void remove_page(size_t pageno); public: // Constructors - explicit s_mc_pages_store(size_t size); - ~s_mc_pages_store(); + PageStore(PageStore const&) = delete; + PageStore& operator=(PageStore const&) = delete; + explicit PageStore(size_t size); + ~PageStore(); public: // Methods @@ -178,54 +179,38 @@ public: // Debug/test methods }; inline __attribute__((always_inline)) -void s_mc_pages_store::unref_page(size_t pageno) { +void PageStore::unref_page(size_t pageno) { if ((--this->page_counts_[pageno]) == 0) { this->remove_page(pageno); } } inline __attribute__((always_inline)) -void s_mc_pages_store::ref_page(size_t pageno) { +void PageStore::ref_page(size_t pageno) { ++this->page_counts_[pageno]; } inline __attribute__((always_inline)) -const void* s_mc_pages_store::get_page(size_t pageno) const { +const void* PageStore::get_page(size_t pageno) const { return mc_page_from_number(this->memory_, pageno); } inline __attribute__((always_inline)) -size_t s_mc_pages_store::get_ref(size_t pageno) { +size_t PageStore::get_ref(size_t pageno) { return this->page_counts_[pageno]; } inline __attribute__((always_inline)) -size_t s_mc_pages_store::size() { +size_t PageStore::size() { return this->top_index_ - this->free_pages_.size(); } inline __attribute__((always_inline)) -size_t s_mc_pages_store::capacity() { +size_t PageStore::capacity() { return this->capacity_; } -#endif - -SG_BEGIN_DECL() - -mc_pages_store_t mc_pages_store_new(void); -void mc_pages_store_delete(mc_pages_store_t store); - -/** - */ -static inline __attribute__((always_inline)) -const void* mc_page_store_get_page(mc_pages_store_t page_store, size_t pageno) -{ - // This is page_store->memory_: - void* memory = *(void**)page_store; - return mc_page_from_number(memory, pageno); } - -SG_END_DECL() +} #endif diff --git a/src/mc/mc_forward.h b/src/mc/mc_forward.h index 3e3baa1d96..2152fe8bcc 100644 --- a/src/mc/mc_forward.h +++ b/src/mc/mc_forward.h @@ -14,15 +14,18 @@ namespace simgrid { namespace mc { + class PageStore; class ModelChecker; } } typedef ::simgrid::mc::ModelChecker s_mc_model_checker_t; +typedef ::simgrid::mc::PageStore s_mc_pages_store_t; #else typedef struct _s_mc_model_checker s_mc_model_checker_t; +typedef struct _s_mc_pages_store s_mc_pages_store_t; #endif @@ -31,7 +34,7 @@ typedef struct s_dw_type s_dw_type_t, *dw_type_t; typedef struct s_memory_map s_memory_map_t, *memory_map_t; typedef struct s_dw_variable s_dw_variable_t, *dw_variable_t; typedef struct s_dw_frame s_dw_frame_t, *dw_frame_t; -typedef struct s_mc_pages_store s_mc_pages_store_t, *mc_pages_store_t; +typedef s_mc_pages_store_t *mc_pages_store_t; typedef struct s_mc_snapshot s_mc_snapshot_t, *mc_snapshot_t; typedef struct s_mc_process s_mc_process_t, * mc_process_t; typedef s_mc_model_checker_t *mc_model_checker_t; diff --git a/src/mc/mc_page_snapshot.cpp b/src/mc/mc_page_snapshot.cpp index bfcbb31c8c..72d71c1dec 100644 --- a/src/mc/mc_page_snapshot.cpp +++ b/src/mc/mc_page_snapshot.cpp @@ -7,7 +7,7 @@ #include // pread, pwrite -#include "mc_page_store.h" +#include "PageStore.hpp" #include "mc_mmu.h" #include "mc_private.h" #include "mc_snapshot.h" diff --git a/src/mc/mc_snapshot.cpp b/src/mc/mc_snapshot.cpp index 8a2422d9c6..f1a1c66925 100644 --- a/src/mc/mc_snapshot.cpp +++ b/src/mc/mc_snapshot.cpp @@ -12,7 +12,7 @@ #include "mc_snapshot.h" #include "mc_private.h" #include "mc_mmu.h" -#include "mc_page_store.h" +#include "PageStore.hpp" extern "C" { diff --git a/src/mc/mc_snapshot.h b/src/mc/mc_snapshot.h index ceb0ef66be..738fee3154 100644 --- a/src/mc/mc_snapshot.h +++ b/src/mc/mc_snapshot.h @@ -17,7 +17,7 @@ #include "mc_forward.h" #include "ModelChecker.hpp" -#include "mc_page_store.h" +#include "PageStore.hpp" #include "mc_mmalloc.h" #include "mc_address_space.h" #include "mc_unw.h" @@ -114,8 +114,8 @@ void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region) { size_t pageno = mc_page_number(region->start_addr, (void*) addr); size_t snapshot_pageno = region->chunked.page_numbers[pageno]; - const void* snapshot_page = mc_page_store_get_page( - &mc_model_checker->page_store(), snapshot_pageno); + const void* snapshot_page = + mc_model_checker->page_store().get_page(snapshot_pageno); return (char*) snapshot_page + mc_page_offset((void*) addr); }