From 1dc3cb7c2d85db5b01f325d54e3f008f5ef6619f Mon Sep 17 00:00:00 2001 From: Ehsan Azimi Date: Mon, 23 Nov 2020 13:56:36 +0100 Subject: [PATCH] mc_api::get_pattern_comm_rdv() mc_api::get_pattern_comm_addr() mc_api::get_pattern_comm_src_proc() mc_api::get_pattern_comm_data() mc_api::get_actor_host_name() The above functions are defined in mc_api and being used in comm_dete checker --- .../CommunicationDeterminismChecker.cpp | 29 +++++++++------ src/mc/mc_api.cpp | 37 ++++++++++++++++++- src/mc/mc_api.hpp | 4 ++ 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/mc/checker/CommunicationDeterminismChecker.cpp b/src/mc/checker/CommunicationDeterminismChecker.cpp index a686d4a53f..7e269ea22a 100644 --- a/src/mc/checker/CommunicationDeterminismChecker.cpp +++ b/src/mc/checker/CommunicationDeterminismChecker.cpp @@ -174,7 +174,7 @@ void CommunicationDeterminismChecker::deterministic_comm_pattern(int process, co void CommunicationDeterminismChecker::get_comm_pattern(smx_simcall_t request, e_mc_call_type_t call_type, int backtracking) { - const smx_actor_t issuer = MC_smx_simcall_get_issuer(request); + const smx_actor_t issuer = mcapi::get().mc_smx_simcall_get_issuer(request); const mc::PatternCommunicationList& initial_pattern = initial_communications_pattern[issuer->get_pid()]; const std::vector& incomplete_pattern = incomplete_communications_pattern[issuer->get_pid()]; @@ -184,7 +184,7 @@ void CommunicationDeterminismChecker::get_comm_pattern(smx_simcall_t request, e_ if (call_type == MC_CALL_TYPE_SEND) { /* Create comm pattern */ pattern->type = PatternCommunicationType::send; - pattern->comm_addr = static_cast(simcall_comm_isend__getraw__result(request)); + pattern->comm_addr = mcapi::get().get_pattern_comm_addr(request); Remote temp_synchro; mc_model_checker->get_remote_simulation().read(temp_synchro, remote(pattern->comm_addr)); @@ -192,11 +192,9 @@ void CommunicationDeterminismChecker::get_comm_pattern(smx_simcall_t request, e_ char* remote_name = mc_model_checker->get_remote_simulation().read(RemotePtr( (uint64_t)(synchro->get_mailbox() ? &synchro->get_mailbox()->name_ : &synchro->mbox_cpy->name_))); - // pattern->rdv = mc_model_checker->get_remote_simulation().read_string(RemotePtr(remote_name)); - pattern->rdv = mc_api::get().get_pattern_comm_rdv(pattern->comm_addr); - pattern->src_proc = - mc_model_checker->get_remote_simulation().resolve_actor(mc::remote(synchro->src_actor_.get()))->get_pid(); - pattern->src_host = MC_smx_actor_get_host_name(issuer); + pattern->rdv = mcapi::get().get_pattern_comm_rdv(pattern->comm_addr); + pattern->src_proc = mcapi::get().get_pattern_comm_src_proc(pattern->comm_addr); + pattern->src_host = mc_api::get().get_actor_host_name(issuer); #if HAVE_SMPI simgrid::smpi::Request mpi_request; @@ -205,10 +203,17 @@ void CommunicationDeterminismChecker::get_comm_pattern(smx_simcall_t request, e_ pattern->tag = mpi_request.tag(); #endif - if (synchro->src_buff_ != nullptr) { - pattern->data.resize(synchro->src_buff_size_); - mc_model_checker->get_remote_simulation().read_bytes(pattern->data.data(), pattern->data.size(), - remote(synchro->src_buff_)); + // if (synchro->src_buff_ != nullptr) { + // pattern->data.resize(synchro->src_buff_size_); + // mc_model_checker->get_remote_simulation().read_bytes(pattern->data.data(), pattern->data.size(), + // remote(synchro->src_buff_)); + // } + + auto pattern_data = mcapi::get().get_pattern_comm_data(pattern->comm_addr); + if(pattern_data.data() != nullptr) { + auto data_size = pattern_data.size(); + pattern->data.resize(data_size); + memcpy(pattern->data.data(), pattern_data.data(), data_size); } #if HAVE_SMPI if(mpi_request.detached()){ @@ -300,7 +305,7 @@ std::vector CommunicationDeterminismChecker::get_textual_trace() // for (auto const& state : stack_) { smx_simcall_t req = &state->executed_req_; if (req) - trace.push_back(request_to_string(req, state->transition_.argument_, RequestType::executed)); + trace.push_back(mcapi::get().request_to_string(req, state->transition_.argument_, RequestType::executed)); } return trace; } diff --git a/src/mc/mc_api.cpp b/src/mc/mc_api.cpp index f21715fbd3..21e90ee842 100644 --- a/src/mc/mc_api.cpp +++ b/src/mc/mc_api.cpp @@ -209,6 +209,11 @@ void mc_api::copy_index_comm_pattern(const simgrid::mc::State* state) const MC_state_copy_index_communications_pattern((simgrid::mc::State*)state); } +kernel::activity::CommImpl* mc_api::get_pattern_comm_addr(smx_simcall_t request) const +{ + auto comm_addr = simcall_comm_isend__getraw__result(request); + return static_cast(comm_addr); +} std::string mc_api::get_pattern_comm_rdv(void* addr) const { Remote temp_synchro; @@ -221,10 +226,40 @@ std::string mc_api::get_pattern_comm_rdv(void* addr) const return rdv; } +unsigned long mc_api::get_pattern_comm_src_proc(void* addr) const +{ + Remote temp_synchro; + mc_model_checker->get_remote_simulation().read(temp_synchro, remote((simgrid::kernel::activity::CommImpl*)addr)); + const kernel::activity::CommImpl* synchro = temp_synchro.get_buffer(); + auto src_proc = mc_model_checker->get_remote_simulation().resolve_actor(mc::remote(synchro->src_actor_.get()))->get_pid(); + return src_proc; +} + +std::vector mc_api::get_pattern_comm_data(void* addr) const +{ + Remote temp_synchro; + mc_model_checker->get_remote_simulation().read(temp_synchro, remote((simgrid::kernel::activity::CommImpl*)addr)); + const kernel::activity::CommImpl* synchro = temp_synchro.get_buffer(); + + std::vector buffer {}; + if (synchro->src_buff_ != nullptr) { + buffer.resize(synchro->src_buff_size_); + mc_model_checker->get_remote_simulation().read_bytes(buffer.data(), buffer.size(), + remote(synchro->src_buff_)); + } + return buffer; +} + +const char* mc_api::get_actor_host_name(smx_actor_t actor) const +{ + const char* host_name = MC_smx_actor_get_host_name(actor); + return host_name; +} + std::size_t mc_api::get_remote_heap_bytes() const { RemoteSimulation& process = mc_model_checker->get_remote_simulation(); - auto heap_bytes_used = mmalloc_get_bytes_used_remote(process.get_heap()->heaplimit, process.get_malloc_info()); + auto heap_bytes_used = mmalloc_get_bytes_used_remote(process.get_heap()->heaplimit, process.get_malloc_info()); return heap_bytes_used; } diff --git a/src/mc/mc_api.hpp b/src/mc/mc_api.hpp index e42ab91984..278c813a02 100644 --- a/src/mc/mc_api.hpp +++ b/src/mc/mc_api.hpp @@ -46,7 +46,11 @@ public: // COMM FUNCTIONS void copy_incomplete_comm_pattern(const simgrid::mc::State* state) const; void copy_index_comm_pattern(const simgrid::mc::State* state) const; + kernel::activity::CommImpl* get_pattern_comm_addr(smx_simcall_t request) const; std::string get_pattern_comm_rdv(void* addr) const; + unsigned long get_pattern_comm_src_proc(void* addr) const; + std::vector get_pattern_comm_data(void* addr) const; + const char* get_actor_host_name(smx_actor_t actor) const; // REMOTE std::size_t get_remote_heap_bytes() const; -- 2.20.1