X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/99a8e224b5973a2cae9e379c140ceaa9c5a467f4..706dd4584b4002e0d948b81d103dd5c4b70db077:/src/mc/Process.hpp diff --git a/src/mc/Process.hpp b/src/mc/Process.hpp index b709c33779..e797a0a106 100644 --- a/src/mc/Process.hpp +++ b/src/mc/Process.hpp @@ -33,6 +33,7 @@ #include "src/mc/mc_forward.hpp" #include "src/mc/mc_base.h" +#include "src/mc/RemotePtr.hpp" #include "src/mc/AddressSpace.hpp" #include "src/mc/mc_protocol.h" #include "src/mc/ObjectInformation.hpp" @@ -44,11 +45,9 @@ namespace mc { class SimixProcessInformation { public: /** MCed address of the process */ - void* address = nullptr; - union { - /** (Flat) Copy of the process data structure */ - struct s_smx_process copy; - }; + RemotePtr address = nullptr; + Remote copy; + /** Hostname (owned by `mc_modelchecker->hostnames`) */ const char* hostname = nullptr; std::string name; @@ -75,13 +74,13 @@ struct IgnoredHeapRegion { /** Representation of a process * - * This class is mixing a lot of differents responsabilities and is tied - * to SIMIX. It should probably split into different classes. + * This class is mixing a lot of different responsibilities and is tied + * to SIMIX. It should probably be split into different classes. * - * Responsabilities: + * Responsibilities: * * - reading from the process memory (`AddressSpace`); - * - accessing the system state of the porcess (heap, …); + * - accessing the system state of the process (heap, …); * - storing the SIMIX state of the process; * - privatization; * - communication with the model-checked process; @@ -119,7 +118,11 @@ public: read_variable(name, &res, sizeof(T)); return res; } - std::string read_string(RemotePtr address) const; + std::string read_string(RemotePtr address) const; + std::string read_string(RemotePtr address, std::size_t len) const + { + return AddressSpace::read_string(address, len); + } // Write memory: void write_bytes(const void* buffer, size_t len, RemotePtr address); @@ -177,9 +180,6 @@ public: running_ = false; } - void reset_soft_dirty(); - void read_pagemap(uint64_t* pagemap, size_t start_page, size_t page_count); - bool privatized(ObjectInformation const& info) const { return privatized_ && info.executable(); @@ -217,6 +217,34 @@ public: std::vector& simix_processes(); std::vector& old_simix_processes(); + /** Get a local description of a remote SIMIX process */ + simgrid::mc::SimixProcessInformation* resolveProcessInfo( + simgrid::mc::RemotePtr process) + { + xbt_assert(mc_model_checker != nullptr); + if (!process) + return nullptr; + this->refresh_simix(); + for (auto& process_info : this->smx_process_infos) + if (process_info.address == process) + return &process_info; + for (auto& process_info : this->smx_old_process_infos) + if (process_info.address == process) + return &process_info; + return nullptr; + } + + /** Get a local copy of the SIMIX process structure */ + simgrid::simix::Process* resolveProcess(simgrid::mc::RemotePtr process) + { + simgrid::mc::SimixProcessInformation* process_info = + this->resolveProcessInfo(process); + if (process_info) + return process_info->copy.getBuffer(); + else + return nullptr; + } + void dumpStack(); private: @@ -233,8 +261,6 @@ private: RemotePtr maestro_stack_start_, maestro_stack_end_; int memory_file = -1; std::vector ignored_regions_; - int clear_refs_fd_ = -1; - int pagemap_fd_ = -1; bool privatized_ = false; std::vector stack_areas_; std::vector ignored_heap_; @@ -292,7 +318,7 @@ public: // Libunwind-data */ unw_addr_space_t unw_addr_space; - /** Underlying libunwind addres-space + /** Underlying libunwind address-space * * The `find_proc_info`, `put_unwind_info`, `get_dyn_info_list_addr` * operations of the native MC address space is currently delegated