X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8173f52406580284c8ec5feab41784a8f4aed8ce..89df17fd2f872e224e49bbdeeba43ca76a5b7d71:/src/mc/AddressSpace.hpp diff --git a/src/mc/AddressSpace.hpp b/src/mc/AddressSpace.hpp index 07f18df8a7..1da65e81cd 100644 --- a/src/mc/AddressSpace.hpp +++ b/src/mc/AddressSpace.hpp @@ -19,6 +19,98 @@ 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_; + } + bool operator!() 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 +bool operator<(remote_ptr const& x, remote_ptr const& y) +{ + return x.address() < y.address(); +} + +template +bool operator>(remote_ptr const& x, remote_ptr const& y) +{ + return x.address() > y.address(); +} + +template +bool operator>=(remote_ptr const& x, remote_ptr const& y) +{ + return x.address() >= y.address(); +} + +template +bool operator<=(remote_ptr const& x, remote_ptr const& y) +{ + return x.address() <= y.address(); +} + +template +bool operator==(remote_ptr const& x, remote_ptr const& y) +{ + return x.address() == y.address(); +} + +template +bool operator!=(remote_ptr const& x, remote_ptr const& y) +{ + return x.address() != y.address(); +} + +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. @@ -46,14 +138,21 @@ 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; - return *(T*)this->read_bytes(&res, sizeof(T), address, process_index); + return *(T*)this->read_bytes(&res, sizeof(T), ptr, process_index); } };