X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/78ad8111935dd39520e2cbae135e042817d78583..376226ea601ffe2aebfb2e07fb14ddd83c1507da:/src/mc/AddressSpace.hpp?ds=sidebyside diff --git a/src/mc/AddressSpace.hpp b/src/mc/AddressSpace.hpp index 8ac72ea462..05665fb4d6 100644 --- a/src/mc/AddressSpace.hpp +++ b/src/mc/AddressSpace.hpp @@ -16,18 +16,61 @@ #include "mc_forward.h" -// Compatibility stuff, will be removed: -#define MC_ADDRESS_SPACE_READ_FLAGS_NONE ::simgrid::mc::AddressSpace::Normal -#define MC_ADDRESS_SPACE_READ_FLAGS_LAZY ::simgrid::mc::AddressSpace::Lazy - -// Compatibility stuff, will be removed: -#define MC_PROCESS_INDEX_MISSING ::simgrid::mc::ProcessIndexMissing -#define MC_PROCESS_INDEX_DISABLED ::simgrid::mc::ProcessIndexDisabled -#define MC_PROCESS_INDEX_ANY ::simgrid::mc::ProcessIndexAny - namespace simgrid { namespace mc { +/** Pointer to a remote address-space (process, snapshot) + * + * With this we can clearly identify the expected type of an address in the + * remote process whild avoiding to use native local pointers. + */ +template class remote_ptr { + std::uint64_t address_; +public: + remote_ptr() : address_(0) {} + remote_ptr(std::uint64_t address) : address_(address) {} + remote_ptr(T* address) : address_((std::uint64_t)address) {} + std::uint64_t address() const { return address_; } + operator bool() const + { + return address_; + } + operator remote_ptr() const + { + return remote_ptr(address_); + } + remote_ptr operator+(std::uint64_t n) const + { + return remote_ptr(address_ + n * sizeof(T)); + } + remote_ptr operator-(std::uint64_t n) const + { + return remote_ptr(address_ - n * sizeof(T)); + } + remote_ptr& operator+=(std::uint64_t n) const + { + address_ += n * sizeof(T); + return *this; + } + remote_ptr& operator-=(std::uint64_t n) const + { + address_ -= n * sizeof(T); + return *this; + } +}; + +template inline +remote_ptr remote(T *p) +{ + return remote_ptr(p); +} + +template inline +remote_ptr remote(uint64_t p) +{ + return remote_ptr(p); +} + /** Process index used when no process is available * * The expected behaviour is that if a process index is needed it will fail. @@ -55,30 +98,25 @@ public: }; virtual ~AddressSpace(); virtual const void* read_bytes(void* buffer, std::size_t size, - std::uint64_t address, int process_index = ProcessIndexAny, - ReadMode mode = Normal) = 0; - template - T read(uint64_t address, int process_index = ProcessIndexMissing) + remote_ptr address, int process_index = ProcessIndexAny, + ReadMode mode = Normal) const = 0; + + template inline + void read(T *buffer, remote_ptr ptr, int process_index = ProcessIndexAny) + { + this->read_bytes(buffer, sizeof(T), ptr, process_index); + } + + template inline + T read(remote_ptr ptr, int process_index = ProcessIndexMissing) { static_assert(std::is_trivial::value, "Cannot read a non-trivial type"); T res; - this->read_bytes(&res, sizeof(T), address, process_index); - return res; + return *(T*)this->read_bytes(&res, sizeof(T), ptr, process_index); } }; } } -// Deprecated compatibility wrapper: -static inline -const void* MC_address_space_read( - mc_address_space_t address_space, simgrid::mc::AddressSpace::ReadMode mode, - void* target, const void* addr, size_t size, - int process_index) -{ - return address_space->read_bytes(target, size, (std::uint64_t) addr, - process_index, mode); -} - #endif