From: Gabriel Corona Date: Thu, 10 Mar 2016 13:05:20 +0000 (+0100) Subject: [mc] Move some SIMIX inspection code in the Process class X-Git-Tag: v3_13~451^2~11 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/3db47603316610f1878cb48634c357b75bbbed9d [mc] Move some SIMIX inspection code in the Process class --- diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index 6bf24dcb9e..5dfae37630 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -688,9 +688,16 @@ void Process::ignore_local_variable(const char *var_name, const char *frame_name std::vector& Process::simix_processes() { xbt_assert(mc_mode != MC_MODE_CLIENT); - MC_process_smx_refresh(&mc_model_checker->process()); + this->refresh_simix(); return smx_process_infos; } +std::vector& Process::old_simix_processes() +{ + xbt_assert(mc_mode != MC_MODE_CLIENT); + this->refresh_simix(); + return smx_old_process_infos; +} + } } diff --git a/src/mc/Process.hpp b/src/mc/Process.hpp index cd090fcdc2..a2cef8542e 100644 --- a/src/mc/Process.hpp +++ b/src/mc/Process.hpp @@ -82,6 +82,19 @@ 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. + * + * Responsabilities: + * + * - reading from the process memory (`AddressSpace`); + * - accessing the system state of the porcess (heap, …); + * - storing the SIMIX state of the process; + * - privatization; + * - communication with the model-checked process; + * - stack unwinding; + * - etc. */ class Process final : public AddressSpace { public: @@ -215,11 +228,13 @@ public: void ignore_local_variable(const char *var_name, const char *frame_name); int socket() { return socket_; } std::vector& simix_processes(); + std::vector& old_simix_processes(); private: void init_memory_map_info(); void refresh_heap(); void refresh_malloc_info(); + void refresh_simix(); private: pid_t pid_ = -1; diff --git a/src/mc/mc_smx.cpp b/src/mc/mc_smx.cpp index ef15f63ef5..04361857b8 100644 --- a/src/mc/mc_smx.cpp +++ b/src/mc/mc_smx.cpp @@ -71,29 +71,35 @@ static void MC_process_refresh_simix_process_list( assert(i == swag.count); } -void MC_process_smx_refresh(simgrid::mc::Process* process) +namespace simgrid { +namespace mc { + +void Process::refresh_simix() { xbt_assert(mc_mode == MC_MODE_SERVER); - if (process->cache_flags & MC_PROCESS_CACHE_FLAG_SIMIX_PROCESSES) + if (this->cache_flags & MC_PROCESS_CACHE_FLAG_SIMIX_PROCESSES) return; // TODO, avoid to reload `&simix_global`, `simix_global`, `*simix_global` // simix_global_p = REMOTE(simix_global); smx_global_t simix_global_p; - process->read_variable("simix_global", &simix_global_p, sizeof(simix_global_p)); + this->read_variable("simix_global", &simix_global_p, sizeof(simix_global_p)); // simix_global = REMOTE(*simix_global) s_smx_global_t simix_global; - process->read_bytes(&simix_global, sizeof(simix_global), + this->read_bytes(&simix_global, sizeof(simix_global), remote(simix_global_p)); MC_process_refresh_simix_process_list( - process, process->smx_process_infos, simix_global.process_list); + this, this->smx_process_infos, simix_global.process_list); MC_process_refresh_simix_process_list( - process, process->smx_old_process_infos, simix_global.process_to_destroy); + this, this->smx_old_process_infos, simix_global.process_to_destroy); - process->cache_flags |= MC_PROCESS_CACHE_FLAG_SIMIX_PROCESSES; + this->cache_flags |= MC_PROCESS_CACHE_FLAG_SIMIX_PROCESSES; +} + +} } /** Get the issuer of a simcall (`req->issuer`) @@ -110,16 +116,14 @@ smx_process_t MC_smx_simcall_get_issuer(smx_simcall_t req) if (mc_mode == MC_MODE_CLIENT) return req->issuer; - MC_process_smx_refresh(&mc_model_checker->process()); - // This is the address of the smx_process in the MCed process: void* address = req->issuer; // Lookup by address: - for (auto& p : mc_model_checker->process().smx_process_infos) + for (auto& p : mc_model_checker->process().simix_processes()) if (p.address == address) return &p.copy; - for (auto& p : mc_model_checker->process().smx_old_process_infos) + for (auto& p : mc_model_checker->process().old_simix_processes()) if (p.address == address) return &p.copy; diff --git a/src/mc/mc_visited.cpp b/src/mc/mc_visited.cpp index 590b3cf3bf..54ea67b4ac 100644 --- a/src/mc/mc_visited.cpp +++ b/src/mc/mc_visited.cpp @@ -56,9 +56,8 @@ VisitedState::VisitedState() process->get_heap()->heaplimit, process->get_malloc_info()); - MC_process_smx_refresh(&mc_model_checker->process()); this->nb_processes = - mc_model_checker->process().smx_process_infos.size(); + mc_model_checker->process().simix_processes().size(); this->num = mc_stats->expanded_states; this->other_num = -1; @@ -81,9 +80,8 @@ VisitedPair::VisitedPair(int pair_num, xbt_automaton_state_t automaton_state, xb process->get_heap()->heaplimit, process->get_malloc_info()); - MC_process_smx_refresh(&mc_model_checker->process()); this->nb_processes = - mc_model_checker->process().smx_process_infos.size(); + mc_model_checker->process().simix_processes().size(); this->automaton_state = automaton_state; this->num = pair_num;