X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/78ad8111935dd39520e2cbae135e042817d78583..50d1b7d92ae3aa2679bc86780cf3c0ea12455365:/src/mc/AddressSpace.hpp diff --git a/src/mc/AddressSpace.hpp b/src/mc/AddressSpace.hpp index 8ac72ea462..6aed5ea8a2 100644 --- a/src/mc/AddressSpace.hpp +++ b/src/mc/AddressSpace.hpp @@ -1,32 +1,114 @@ -/* Copyright (c) 2008-2014. The SimGrid Team. +/* Copyright (c) 2008-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#ifndef MC_ADDRESS_SPACE_H -#define MC_ADDRESS_SPACE_H +#ifndef SIMGRID_MC_ADDRESS_SPACE_H +#define SIMGRID_MC_ADDRESS_SPACE_H +#include #include #include #include -#include +#include "mc_forward.hpp" -#include "mc_forward.h" +namespace simgrid { +namespace mc { -// 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 +/** 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::uintptr_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; + } +}; -// 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 +template +bool operator<(remote_ptr const& x, remote_ptr const& y) +{ + return x.address() < y.address(); +} -namespace simgrid { -namespace mc { +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 * @@ -45,6 +127,8 @@ const int ProcessIndexDisabled = -2; const int ProcessIndexAny = 0; class AddressSpace { +private: + Process* process_; public: enum ReadMode { Normal, @@ -53,32 +137,30 @@ public: */ Lazy }; + AddressSpace(Process* process) : process_(process) {} virtual ~AddressSpace(); + + simgrid::mc::Process* process() const { return process_; } 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