From: Gabriel Corona Date: Fri, 22 May 2015 11:12:27 +0000 (+0200) Subject: [mc] Fix the translation of privatisation section in Process::read_bytes() X-Git-Tag: v3_12~720 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/685abfc633c649bcdb3e36698bbd10ab0a2a1bc6 [mc] Fix the translation of privatisation section in Process::read_bytes() --- diff --git a/src/mc/mc_process.cpp b/src/mc/mc_process.cpp index 0b4a9ba065..9f944d3909 100644 --- a/src/mc/mc_process.cpp +++ b/src/mc/mc_process.cpp @@ -534,10 +534,21 @@ const void *Process::read_bytes(void* buffer, std::size_t size, if (MC_object_info_is_privatized(info)) { if (process_index < 0) xbt_die("Missing process index"); + if (process_index >= (int) MC_smpi_process_count()) + xbt_die("Invalid process index"); + + // Read smpi_privatisation_regions from MCed: + smpi_privatisation_region_t remote_smpi_privatisation_regions = + mc_model_checker->process().read_variable( + "smpi_privatisation_regions"); + + s_smpi_privatisation_region_t privatisation_region = + mc_model_checker->process().read( + remote(remote_smpi_privatisation_regions + process_index)); + // Address translation in the privaization segment: - // TODO, fix me (broken) size_t offset = address.address() - (std::uint64_t)info->start_rw; - address = remote(address.address() - offset); + address = remote((char*)privatisation_region.address + offset); } } diff --git a/src/mc/mc_process.h b/src/mc/mc_process.h index 238fa366a5..d26ca5b2c4 100644 --- a/src/mc/mc_process.h +++ b/src/mc/mc_process.h @@ -71,6 +71,14 @@ public: remote_ptr address, int process_index = ProcessIndexAny, ReadMode mode = Normal) const override; void read_variable(const char* name, void* target, size_t size) const; + template + T read_variable(const char *name) const + { + static_assert(std::is_trivial::value, "Cannot read a non-trivial type"); + T res; + read_variable(name, &res, sizeof(T)); + return res; + } char* read_string(remote_ptr address) const; // Write memory: