X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1242154344890b641971b49954a6cd0d49fe037b..7bc01999f5003e51cc1d12f93647999a1a143f23:/src/mc/RemotePtr.hpp diff --git a/src/mc/RemotePtr.hpp b/src/mc/RemotePtr.hpp index 23d03729dc..e69af01a86 100644 --- a/src/mc/RemotePtr.hpp +++ b/src/mc/RemotePtr.hpp @@ -7,11 +7,66 @@ #ifndef SIMGRID_MC_REMOTE_PTR_HPP #define SIMGRID_MC_REMOTE_PTR_HPP +#include #include +#include + +#include +#include namespace simgrid { namespace mc { +/** HACK, 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 +union Remote { +private: + T buffer; +public: + Remote() {} + ~Remote() {} + Remote(T& p) + { + std::memcpy(&buffer, &p, sizeof(buffer)); + } + Remote(Remote const& that) + { + std::memcpy(&buffer, &that.buffer, sizeof(buffer)); + } + Remote& operator=(Remote const& that) + { + std::memcpy(&buffer, &that.buffer, sizeof(buffer)); + return *this; + } + T* getBuffer() { return &buffer; } + const T* getBuffer() const { return &buffer; } + std::size_t getBufferSize() const { return sizeof(T); } + operator T() const { + static_assert(std::is_trivial::value, "Cannot convert non trivial type"); + return buffer; + } + void clear() + { + std::memset(static_cast(&buffer), 0, sizeof(T)); + } + +}; + /** Pointer to a remote address-space (process, snapshot) * * With this we can clearly identify the expected type of an address in the @@ -32,12 +87,13 @@ public: RemotePtr() : address_(0) {} RemotePtr(std::uint64_t address) : address_(address) {} RemotePtr(T* address) : address_((std::uintptr_t)address) {} + RemotePtr(Remote p) : RemotePtr(*p.getBuffer()) {} std::uint64_t address() const { return address_; } /** Turn into a local pointer * (if the remote process is not, in fact, remote) */ - T* local() { return (T*) address_; } + T* local() const { return (T*) address_; } operator bool() const {