Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] C++ class PageStore
authorGabriel Corona <gabriel.corona@loria.fr>
Fri, 17 Apr 2015 12:32:43 +0000 (14:32 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Fri, 17 Apr 2015 12:37:28 +0000 (14:37 +0200)
.gitignore
buildtools/Cmake/DefinePackages.cmake
buildtools/Cmake/UnitTesting.cmake
src/mc/ModelChecker.cpp
src/mc/ModelChecker.hpp
src/mc/PageStore.cpp [moved from src/mc/mc_page_store.cpp with 91% similarity]
src/mc/PageStore.hpp [moved from src/mc/mc_page_store.h with 88% similarity]
src/mc/mc_forward.h
src/mc/mc_page_snapshot.cpp
src/mc/mc_snapshot.cpp
src/mc/mc_snapshot.h

index 973db9c..a3bc468 100644 (file)
@@ -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
index 83cce20..b08922f 100644 (file)
@@ -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
index 411ff08..2435bf6 100644 (file)
@@ -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()
index 061ca74..1c3b76a 100644 (file)
@@ -7,7 +7,7 @@
 #include <cassert>
 
 #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_);
 }
index 5fb8204..b88c39f 100644 (file)
@@ -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);
 };
similarity index 91%
rename from src/mc/mc_page_store.cpp
rename to src/mc/PageStore.cpp
index db4bc05..2935004 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <xbt.h>
 
-#include "mc_page_store.h"
+#include "PageStore.hpp"
 
 #ifdef MC_PAGE_STORE_MD4
 #include <nettle/md4.h>
@@ -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<uint64_t,2> 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 <memory>
 
-#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<s_mc_pages_store_t> store = std::unique_ptr<s_mc_pages_store_t>(new s_mc_pages_store(500));
+  std::unique_ptr<simgrid::mc::PageStore> store
+    = std::unique_ptr<simgrid::mc::PageStore>(new simgrid::mc::PageStore(500));
   void* data = getpage();
   xbt_test_assert(store->size()==0, "Bad size");
 
similarity index 88%
rename from src/mc/mc_page_store.h
rename to src/mc/PageStore.hpp
index 2f79705..4e09ab7 100644 (file)
@@ -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<uint64_t,2> 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
index 3e3baa1..2152fe8 100644 (file)
 
 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;
index bfcbb31..72d71c1 100644 (file)
@@ -7,7 +7,7 @@
 
 #include <unistd.h> // pread, pwrite
 
-#include "mc_page_store.h"
+#include "PageStore.hpp"
 #include "mc_mmu.h"
 #include "mc_private.h"
 #include "mc_snapshot.h"
index 8a2422d..f1a1c66 100644 (file)
@@ -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" {
 
index ceb0ef6..738fee3 100644 (file)
@@ -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);
 }