X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/242fde5e8077f8193db4df5f262a9672085c8d8a..53dd673a07059d04f7ee5c280470958856fdf8d8:/src/mc/RegionSnapshot.hpp diff --git a/src/mc/RegionSnapshot.hpp b/src/mc/RegionSnapshot.hpp index 9915186a69..1ece645c94 100644 --- a/src/mc/RegionSnapshot.hpp +++ b/src/mc/RegionSnapshot.hpp @@ -10,79 +10,15 @@ #include #include -#include "PageStore.hpp" -#include "AddressSpace.hpp" +#include + +#include "src/mc/PageStore.hpp" +#include "src/mc/AddressSpace.hpp" +#include "src/mc/ChunkedData.hpp" namespace simgrid { namespace mc { -class PerPageCopy { - PageStore* store_; - std::vector pagenos_; -public: - PerPageCopy() : store_(nullptr) {} - PerPageCopy(PerPageCopy const& that) - { - store_ = that.store_; - pagenos_ = that.pagenos_; - for (std::size_t pageno : pagenos_) - store_->ref_page(pageno); - } - void clear() - { - for (std::size_t pageno : pagenos_) - store_->unref_page(pageno); - pagenos_.clear(); - } - ~PerPageCopy() { - clear(); - } - - PerPageCopy(PerPageCopy&& that) - { - store_ = that.store_; - that.store_ = nullptr; - pagenos_ = std::move(that.pagenos_); - that.pagenos_.clear(); - } - PerPageCopy& operator=(PerPageCopy const& that) - { - this->clear(); - store_ = that.store_; - pagenos_ = that.pagenos_; - for (std::size_t pageno : pagenos_) - store_->ref_page(pageno); - return *this; - } - PerPageCopy& operator=(PerPageCopy && that) - { - this->clear(); - store_ = that.store_; - that.store_ = nullptr; - pagenos_ = std::move(that.pagenos_); - that.pagenos_.clear(); - return *this; - } - - std::size_t page_count() const - { - return pagenos_.size(); - } - - std::size_t pageno(std::size_t i) const - { - return pagenos_[i]; - } - - const void* page(std::size_t i) const - { - return store_->get_page(pagenos_[i]); - } - - PerPageCopy(PageStore& store, AddressSpace& as, - remote_ptr addr, std::size_t page_count); -}; - enum class RegionType { Unknown = 0, Heap = 1, @@ -97,30 +33,48 @@ enum class StorageType { Privatized = 3 }; -/** @brief Copy/snapshot of a given memory region +class data_deleter { +public: + enum Type { + Free, + Munmap + }; +private: + Type type_; + std::size_t size_; +public: + data_deleter() : type_(Free) {} + data_deleter(Type type, std::size_t size) : type_(type), size_(size) {} + void operator()(void* p) const; +}; + +typedef std::unique_ptr unique_data_ptr; + +/** A copy/snapshot of a given memory region * * Different types of region snapshot storage types exist: - *
    - *
  • flat/dense snapshots are a simple copy of the region;
  • - *
  • sparse/per-page snapshots are snaapshots which shared - * identical pages.
  • - *
  • privatized (SMPI global variable privatisation). - *
+ * + * * flat/dense snapshots are a simple copy of the region; + * + * * sparse/per-page snapshots are snaapshots which shared + * identical pages. + * + * * privatized (SMPI global variable privatisation). * * This is handled with a variant based approch: * - * * `storage_type` identified the type of storage; - * * an anonymous enum is used to distinguish the relevant types for - * each type. + * * `storage_type` identified the type of storage; + * + * * an anonymous enum is used to distinguish the relevant types for + * each type. */ class RegionSnapshot { +public: static const RegionType UnknownRegion = RegionType::Unknown; static const RegionType HeapRegion = RegionType::Heap; static const RegionType DataRegion = RegionType::Data; - static const StorageType NoData = StorageType::NoData; - static const StorageType FlatData = StorageType::Flat; - static const StorageType ChunkedData = StorageType::Chunked; - static const StorageType PrivatizedData = StorageType::Privatized; +public: + typedef unique_data_ptr flat_data_ptr; private: RegionType region_type_; StorageType storage_type_; @@ -130,7 +84,7 @@ private: void *start_addr_; /** @brief Size of the data region in bytes */ - size_t size_; + std::size_t size_; /** @brief Permanent virtual address of the region * @@ -143,13 +97,13 @@ private: * */ void *permanent_addr_; - std::vector flat_data_; - PerPageCopy page_numbers_; + flat_data_ptr flat_data_; + ChunkedData page_numbers_; std::vector privatized_regions_; public: RegionSnapshot() : region_type_(UnknownRegion), - storage_type_(NoData), + storage_type_(StorageType::NoData), object_info_(nullptr), start_addr_(nullptr), size_(0), @@ -157,7 +111,7 @@ public: {} RegionSnapshot(RegionType type, void *start_addr, void* permanent_addr, size_t size) : region_type_(type), - storage_type_(NoData), + storage_type_(StorageType::NoData), object_info_(nullptr), start_addr_(start_addr), size_(size), @@ -199,10 +153,10 @@ public: void clear() { region_type_ = UnknownRegion; - storage_type_ = NoData; + storage_type_ = StorageType::NoData; privatized_regions_.clear(); page_numbers_.clear(); - flat_data_.clear(); + flat_data_.reset(); object_info_ = nullptr; start_addr_ = nullptr; size_ = 0; @@ -211,34 +165,34 @@ public: void clear_data() { - storage_type_ = NoData; - flat_data_.clear(); + storage_type_ = StorageType::NoData; + flat_data_.reset(); page_numbers_.clear(); privatized_regions_.clear(); } - void flat_data(std::vector data) + void flat_data(flat_data_ptr data) { - storage_type_ = FlatData; + storage_type_ = StorageType::Flat; flat_data_ = std::move(data); page_numbers_.clear(); privatized_regions_.clear(); } - std::vector const& flat_data() const { return flat_data_; } + const char* flat_data() const { return flat_data_.get(); } - void page_data(PerPageCopy page_data) + void page_data(ChunkedData page_data) { - storage_type_ = ChunkedData; - flat_data_.clear(); + storage_type_ = StorageType::Chunked; + flat_data_.reset(); page_numbers_ = std::move(page_data); privatized_regions_.clear(); } - PerPageCopy const& page_data() const { return page_numbers_; } + ChunkedData const& page_data() const { return page_numbers_; } void privatized_data(std::vector data) { - storage_type_ = PrivatizedData; - flat_data_.clear(); + storage_type_ = StorageType::Privatized; + flat_data_.reset(); page_numbers_.clear(); privatized_regions_ = std::move(data); } @@ -270,14 +224,17 @@ public: }; RegionSnapshot privatized_region( - RegionType type, void *start_addr, void* data_addr, size_t size); + RegionType region_type, void *start_addr, void* permanent_addr, + std::size_t size, const RegionSnapshot* ref_region); RegionSnapshot dense_region( - RegionType type, void *start_addr, void* data_addr, size_t size); + RegionType type, void *start_addr, void* data_addr, std::size_t size); simgrid::mc::RegionSnapshot sparse_region( - RegionType type, void *start_addr, void* data_addr, size_t size); + RegionType type, void *start_addr, void* data_addr, std::size_t size, + RegionSnapshot const* ref_region); simgrid::mc::RegionSnapshot region( - RegionType type, void *start_addr, void* data_addr, size_t size); - + RegionType type, void *start_addr, void* data_addr, std::size_t size, + RegionSnapshot const* ref_region); + } }