From: Gabriel Corona Date: Thu, 3 Mar 2016 16:54:06 +0000 (+0100) Subject: [mc] Make SimixProcessInformation a real C++ object X-Git-Tag: v3_13~573 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/d73456f299cf29a6880fe7b2a7d88ec2fb6123f4 [mc] Make SimixProcessInformation a real C++ object and use std::vector<> for storing it instead of xbt_dynar --- diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index 2e510676db..c4c951a8c8 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -232,8 +232,8 @@ void Process::init() remote(std_heap_var->address), simgrid::mc::ProcessIndexDisabled); - this->smx_process_infos = MC_smx_process_info_list_new(); - this->smx_old_process_infos = MC_smx_process_info_list_new(); + this->smx_process_infos.clear(); + this->smx_old_process_infos.clear(); this->unw_addr_space = unw_create_addr_space(&mc_unw_accessors , __BYTE_ORDER); this->unw_underlying_addr_space = unw_create_addr_space(&mc_unw_vmread_accessors, __BYTE_ORDER); this->unw_underlying_context = _UPT_create(this->pid_); @@ -247,9 +247,6 @@ Process::~Process() this->maestro_stack_start_ = nullptr; this->maestro_stack_end_ = nullptr; - xbt_dynar_free(&this->smx_process_infos); - xbt_dynar_free(&this->smx_old_process_infos); - if (this->memory_file >= 0) { close(this->memory_file); } @@ -705,7 +702,9 @@ boost::iterator_range Process::simix_processes() { xbt_assert(mc_mode != MC_MODE_CLIENT); MC_process_smx_refresh(&mc_model_checker->process()); - return simgrid::xbt::range(smx_process_infos); + return boost::iterator_range( + &*smx_process_infos.begin(), + &*smx_process_infos.end()); } } diff --git a/src/mc/Process.hpp b/src/mc/Process.hpp index 7c4c983d00..5f2ba9a952 100644 --- a/src/mc/Process.hpp +++ b/src/mc/Process.hpp @@ -62,7 +62,14 @@ public: }; /** Hostname (owned by `mc_modelchecker->hostnames`) */ const char* hostname = nullptr; - char* name = nullptr; + std::string name; + + void clear() + { + name.clear(); + address = nullptr; + hostname = nullptr; + } }; struct IgnoredRegion { @@ -242,13 +249,13 @@ public: // Copies of MCed SMX data structures * * See mc_smx.c. */ - xbt_dynar_t smx_process_infos = nullptr; + std::vector smx_process_infos; /** Copy of `simix_global->process_to_destroy` * * See mc_smx.c. */ - xbt_dynar_t smx_old_process_infos = nullptr; + std::vector smx_old_process_infos; /** State of the cache (which variables are up to date) */ mc_process_cache_flags_t cache_flags = MC_PROCESS_CACHE_FLAG_NONE; @@ -295,6 +302,12 @@ public: // Libunwind-data void* unw_underlying_context; }; +// TODO, remove this +#define MC_PROCESS_FOREACH(xs, cursor, p) \ + if (! xs.empty()) \ + for (auto __it = (cursor = 0, p = &*xs.begin(), xs.begin()); \ + __it != xs.end(); ++__it, ++cursor, p = &*__it) + /** Open a FD to a remote process memory (`/dev/$pid/mem`) */ XBT_PRIVATE int open_vm(pid_t pid, int flags); diff --git a/src/mc/mc_base.cpp b/src/mc/mc_base.cpp index 5b61d7ba2c..82da31fbf2 100644 --- a/src/mc/mc_base.cpp +++ b/src/mc/mc_base.cpp @@ -230,7 +230,7 @@ void MC_simcall_handle(smx_simcall_t req, int value) unsigned i; mc_smx_process_info_t pi = nullptr; - xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, i, pi) { + MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, i, pi) { if (req == &pi->copy.simcall) { mc_model_checker->simcall_handle( mc_model_checker->process(), pi->copy.pid, value); diff --git a/src/mc/mc_smx.cpp b/src/mc/mc_smx.cpp index 205fcf7ed3..868ea757f0 100644 --- a/src/mc/mc_smx.cpp +++ b/src/mc/mc_smx.cpp @@ -21,33 +21,18 @@ using simgrid::mc::remote; extern "C" { -static -void MC_smx_process_info_clear(mc_smx_process_info_t p) -{ - p->hostname = nullptr; - std::free(p->name); - p->name = nullptr; -} - -xbt_dynar_t MC_smx_process_info_list_new(void) -{ - return xbt_dynar_new( - sizeof(s_mc_smx_process_info_t), - ( void_f_pvoid_t) &MC_smx_process_info_clear); -} - static inline -bool is_in_dynar(smx_process_t p, xbt_dynar_t dynar) +bool is_in_vector(smx_process_t p, std::vector& ps) { - return (uintptr_t) p >= (uintptr_t) dynar->data - && (uintptr_t) p < ((uintptr_t) dynar->data + dynar->used * dynar->elmsize); + return (uintptr_t) p >= (uintptr_t) &ps[0] + && (uintptr_t) p < (uintptr_t) &ps[ps.size()]; } static inline mc_smx_process_info_t MC_smx_process_get_info(smx_process_t p) { - assert(is_in_dynar(p, mc_model_checker->process().smx_process_infos) - || is_in_dynar(p, mc_model_checker->process().smx_old_process_infos)); + assert(is_in_vector(p, mc_model_checker->process().smx_process_infos) + || is_in_vector(p, mc_model_checker->process().smx_old_process_infos)); mc_smx_process_info_t process_info = (mc_smx_process_info_t) ((char*) p - offsetof(s_mc_smx_process_info_t, copy)); @@ -62,25 +47,23 @@ mc_smx_process_info_t MC_smx_process_get_info(smx_process_t p) */ static void MC_process_refresh_simix_process_list( simgrid::mc::Process* process, - xbt_dynar_t target, xbt_swag_t remote_swag) + std::vector& target, xbt_swag_t remote_swag) { + target.clear(); + // swag = REMOTE(*simix_global->process_list) s_xbt_swag_t swag; process->read_bytes(&swag, sizeof(swag), remote(remote_swag)); - smx_process_t p; - xbt_dynar_reset(target); - // Load each element of the dynar from the MCed process: int i = 0; - for (p = (smx_process_t) swag.head; p; ++i) { + for (smx_process_t p = (smx_process_t) swag.head; p; ++i) { - s_mc_smx_process_info_t info; + simgrid::mc::SimixProcessInformation info; info.address = p; - info.name = nullptr; info.hostname = nullptr; process->read_bytes(&info.copy, sizeof(info.copy), remote(p)); - xbt_dynar_push(target, &info); + target.push_back(std::move(info)); // Lookup next process address: p = (smx_process_t) xbt_swag_getNext(&info.copy, swag.offset); @@ -136,10 +119,10 @@ smx_process_t MC_smx_simcall_get_issuer(smx_simcall_t req) mc_smx_process_info_t p; // Lookup by address: - xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, i, p) + MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, i, p) if (p->address == address) return &p->copy; - xbt_dynar_foreach_ptr(mc_model_checker->process().smx_old_process_infos, i, p) + MC_PROCESS_FOREACH(mc_model_checker->process().smx_old_process_infos, i, p) if (p->address == address) return &p->copy; @@ -167,10 +150,10 @@ mc_smx_process_info_t MC_smx_resolve_process_info(smx_process_t process_remote_a unsigned index; mc_smx_process_info_t process_info; - xbt_dynar_foreach_ptr(mc_model_checker->process().smx_process_infos, index, process_info) + MC_PROCESS_FOREACH(mc_model_checker->process().smx_process_infos, index, process_info) if (process_info->address == process_remote_address) return process_info; - xbt_dynar_foreach_ptr(mc_model_checker->process().smx_old_process_infos, index, process_info) + MC_PROCESS_FOREACH(mc_model_checker->process().smx_old_process_infos, index, process_info) if (process_info->address == process_remote_address) return process_info; xbt_die("Process info not found"); @@ -222,10 +205,12 @@ const char* MC_smx_process_get_name(smx_process_t p) return nullptr; mc_smx_process_info_t info = MC_smx_process_get_info(p); - if (!info->name) { - info->name = process->read_string(p->name); + if (info->name.empty()) { + char* name = process->read_string(p->name); + info->name = name; + free(name); } - return info->name; + return info->name.c_str(); } #ifdef HAVE_SMPI diff --git a/src/mc/mc_smx.h b/src/mc/mc_smx.h index 7c9fc47943..0d7e87fade 100644 --- a/src/mc/mc_smx.h +++ b/src/mc/mc_smx.h @@ -45,8 +45,6 @@ SG_BEGIN_DECL() typedef s_mc_smx_process_info s_mc_smx_process_info_t, *mc_smx_process_info_t; -XBT_PRIVATE xbt_dynar_t MC_smx_process_info_list_new(void); - XBT_PRIVATE void MC_process_smx_refresh(simgrid::mc::Process* process); /** Get the issuer of a simcall (`req->issuer`) diff --git a/src/mc/mc_visited.cpp b/src/mc/mc_visited.cpp index 1d218bebac..8f07b4ca68 100644 --- a/src/mc/mc_visited.cpp +++ b/src/mc/mc_visited.cpp @@ -67,8 +67,8 @@ static mc_visited_state_t visited_state_new() process->get_malloc_info()); MC_process_smx_refresh(&mc_model_checker->process()); - new_state->nb_processes = xbt_dynar_length( - mc_model_checker->process().smx_process_infos); + new_state->nb_processes = + mc_model_checker->process().smx_process_infos.size(); new_state->system_state = simgrid::mc::take_snapshot(mc_stats->expanded_states); new_state->num = mc_stats->expanded_states; @@ -89,8 +89,8 @@ mc_visited_pair_t MC_visited_pair_new(int pair_num, xbt_automaton_state_t automa process->get_malloc_info()); MC_process_smx_refresh(&mc_model_checker->process()); - pair->nb_processes = xbt_dynar_length( - mc_model_checker->process().smx_process_infos); + pair->nb_processes = + mc_model_checker->process().smx_process_infos.size(); pair->automaton_state = automaton_state; pair->num = pair_num;