From: Gabriel Corona Date: Tue, 10 May 2016 14:07:41 +0000 (+0200) Subject: [mc] Generalize AddressSpace::read() to return a Remote X-Git-Tag: v3_14~1239^2~1 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f754aabeea56ded8bc234a5ffc7dda03428d6b88?ds=inline [mc] Generalize AddressSpace::read() to return a Remote --- diff --git a/src/mc/AddressSpace.hpp b/src/mc/AddressSpace.hpp index 75fbcae0c7..18969aaa0a 100644 --- a/src/mc/AddressSpace.hpp +++ b/src/mc/AddressSpace.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include "src/mc/mc_forward.hpp" @@ -91,15 +92,47 @@ public: static constexpr ReadOptions lazy() { return ReadOptions(1); } }; -/** A value read from another process */ +/** A value from another process + * + * This represents a value from another process: + * + * * constructor/destructor are disabled; + * + * * raw memory copy (std::memcpy) is used to copy Remote; + * + * * raw memory comparison is used to compare them; + * + * * when T is a trivial type, Remote is convertible to a T. + * + * We currently only handle the case where the type has the same layout + * in the current process and in the target process: we don't handle + * cross-architecture (such as 32-bit/64-bit access). + */ template class Remote { private: + // If we use a union, it won't work with abstract types: char buffer[sizeof(T)]; public: + // HACK, some code currently cast this to T* which is **not** legal. void* data() { return buffer; } const void* data() const { return buffer; } constexpr std::size_t size() const { return sizeof(T); } + operator T() const { + static_assert(std::is_trivial::value, "Cannot convert non trivial type"); + T res; + std::memcpy(&res, buffer, sizeof(T)); + return res; + } + Remote() {} + Remote(T const& x) + { + std::memcpy(&x, buffer, sizeof(T)); + } + Remote& operator=(T const& x) + { + std::memcpy(&x, buffer, sizeof(T)); + } }; /** A given state of a given process (abstract base class) @@ -146,11 +179,11 @@ public: /** Read a given data structure from the address space */ template inline - T read(RemotePtr ptr, int process_index = ProcessIndexMissing) + Remote read(RemotePtr 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), ptr, process_index); + Remote res; + this->read_bytes(&res, sizeof(T), ptr, process_index); + return res; } };