X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/242fde5e8077f8193db4df5f262a9672085c8d8a..81c638173fb96d986d183561433ac408f0ea5fcf:/src/mc/RegionSnapshot.hpp diff --git a/src/mc/RegionSnapshot.hpp b/src/mc/RegionSnapshot.hpp index 9915186a69..e54516a157 100644 --- a/src/mc/RegionSnapshot.hpp +++ b/src/mc/RegionSnapshot.hpp @@ -10,6 +10,8 @@ #include #include +#include + #include "PageStore.hpp" #include "AddressSpace.hpp" @@ -74,13 +76,17 @@ public: return pagenos_[i]; } + const std::size_t* pagenos() const { return pagenos_.data(); } + std::size_t* pagenos() { return pagenos_.data(); } + 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); + remote_ptr addr, std::size_t page_count, + const size_t* ref_page_numbers, const std::uint64_t* pagemap); }; enum class RegionType { @@ -97,6 +103,21 @@ enum class StorageType { Privatized = 3 }; +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; +}; + /** @brief Copy/snapshot of a given memory region * * Different types of region snapshot storage types exist: @@ -114,6 +135,7 @@ enum class StorageType { * each type. */ class RegionSnapshot { +public: static const RegionType UnknownRegion = RegionType::Unknown; static const RegionType HeapRegion = RegionType::Heap; static const RegionType DataRegion = RegionType::Data; @@ -121,6 +143,8 @@ class RegionSnapshot { static const StorageType FlatData = StorageType::Flat; static const StorageType ChunkedData = StorageType::Chunked; static const StorageType PrivatizedData = StorageType::Privatized; +public: + typedef std::unique_ptr flat_data_ptr; private: RegionType region_type_; StorageType storage_type_; @@ -143,7 +167,7 @@ private: * */ void *permanent_addr_; - std::vector flat_data_; + flat_data_ptr flat_data_; PerPageCopy page_numbers_; std::vector privatized_regions_; public: @@ -202,7 +226,7 @@ public: storage_type_ = NoData; privatized_regions_.clear(); page_numbers_.clear(); - flat_data_.clear(); + flat_data_.reset(); object_info_ = nullptr; start_addr_ = nullptr; size_ = 0; @@ -212,24 +236,24 @@ public: void clear_data() { storage_type_ = NoData; - flat_data_.clear(); + 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; 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) { storage_type_ = ChunkedData; - flat_data_.clear(); + flat_data_.reset(); page_numbers_ = std::move(page_data); privatized_regions_.clear(); } @@ -238,7 +262,7 @@ public: void privatized_data(std::vector data) { storage_type_ = PrivatizedData; - flat_data_.clear(); + flat_data_.reset(); page_numbers_.clear(); privatized_regions_ = std::move(data); } @@ -274,10 +298,12 @@ RegionSnapshot privatized_region( RegionSnapshot dense_region( RegionType type, void *start_addr, void* data_addr, 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, 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, size_t size, + RegionSnapshot const* ref_region); + } }