X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9f9eacbd59910b9bce3a39e41ce1d966f9a60c4c..7792ce44dc2744211836680af4775a35a823b242:/src/mc/checker/CommunicationDeterminismChecker.cpp diff --git a/src/mc/checker/CommunicationDeterminismChecker.cpp b/src/mc/checker/CommunicationDeterminismChecker.cpp index 42e0f62613..e64020db30 100644 --- a/src/mc/checker/CommunicationDeterminismChecker.cpp +++ b/src/mc/checker/CommunicationDeterminismChecker.cpp @@ -19,7 +19,6 @@ #include -using simgrid::mc::remote; using mcapi = simgrid::mc::mc_api; XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_comm_determinism, mc, "Logging specific to MC communication determinism detection"); @@ -52,6 +51,25 @@ static simgrid::mc::CommPatternDifference compare_comm_pattern(const simgrid::mc return CommPatternDifference::NONE; } +static void patterns_copy(std::vector& dest, + std::vector const& source) +{ + dest.clear(); + for (simgrid::mc::PatternCommunication const& comm : source) { + auto* copy_comm = new simgrid::mc::PatternCommunication(comm.dup()); + dest.push_back(copy_comm); + } +} + +static void restore_communications_pattern(simgrid::mc::State* state) +{ + for (size_t i = 0; i < initial_communications_pattern.size(); i++) + initial_communications_pattern[i].index_comm = state->communication_indices_[i]; + + for (unsigned long i = 0; i < mcapi::get().get_maxpid(); i++) + patterns_copy(incomplete_communications_pattern[i], state->incomplete_comm_pattern_[i]); +} + static char* print_determinism_result(simgrid::mc::CommPatternDifference diff, int process, const simgrid::mc::PatternCommunication* comm, unsigned int cursor) { @@ -95,7 +113,7 @@ static char* print_determinism_result(simgrid::mc::CommPatternDifference diff, i } static void update_comm_pattern(simgrid::mc::PatternCommunication* comm_pattern, - simgrid::mc::RemotePtr comm_addr) + const simgrid::kernel::activity::CommImpl* comm_addr) { auto src_proc = mcapi::get().get_src_actor(comm_addr); auto dst_proc = mcapi::get().get_dst_actor(comm_addr); @@ -104,14 +122,8 @@ static void update_comm_pattern(simgrid::mc::PatternCommunication* comm_pattern, comm_pattern->src_host = mcapi::get().get_actor_host_name(src_proc); comm_pattern->dst_host = mcapi::get().get_actor_host_name(dst_proc); - if (comm_pattern->data.empty()) { - auto pattern_data = mcapi::get().get_pattern_comm_data(comm_addr); - if (pattern_data.data() != nullptr) { - auto data_size = pattern_data.size(); - comm_pattern->data.resize(data_size); - memcpy(comm_pattern->data.data(), pattern_data.data(), data_size); - } - } + if (comm_pattern->data.empty()) + comm_pattern->data = mcapi::get().get_pattern_comm_data(comm_addr); } namespace simgrid { @@ -188,12 +200,7 @@ void CommunicationDeterminismChecker::get_comm_pattern(smx_simcall_t request, Ca #if HAVE_SMPI pattern->tag = mcapi::get().get_smpi_request_tag(request, simgrid::simix::Simcall::COMM_ISEND); #endif - 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); - } + pattern->data = mcapi::get().get_pattern_comm_data(pattern->comm_addr); #if HAVE_SMPI auto send_detached = mcapi::get().check_send_request_detached(request); @@ -227,14 +234,14 @@ void CommunicationDeterminismChecker::get_comm_pattern(smx_simcall_t request, Ca incomplete_communications_pattern[issuer->get_pid()].push_back(pattern.release()); } -void CommunicationDeterminismChecker::complete_comm_pattern(RemotePtr comm_addr, +void CommunicationDeterminismChecker::complete_comm_pattern(const kernel::activity::CommImpl* comm_addr, unsigned int issuer, int backtracking) { /* Complete comm pattern */ std::vector& incomplete_pattern = incomplete_communications_pattern[issuer]; auto current_comm_pattern = std::find_if(begin(incomplete_pattern), end(incomplete_pattern), - [&comm_addr](const PatternCommunication* comm) { return remote(comm->comm_addr) == comm_addr; }); + [&comm_addr](const PatternCommunication* comm) { return mcapi::get().comm_addr_equal(comm->comm_addr, comm_addr); }); if (current_comm_pattern == std::end(incomplete_pattern)) xbt_die("Corresponding communication not found!"); @@ -302,7 +309,7 @@ void CommunicationDeterminismChecker::log_state() // override void CommunicationDeterminismChecker::prepare() { - const int maxpid = mcapi::get().get_maxpid(); + const auto maxpid = mcapi::get().get_maxpid(); initial_communications_pattern.resize(maxpid); incomplete_communications_pattern.resize(maxpid); @@ -339,17 +346,17 @@ void CommunicationDeterminismChecker::restoreState() State* last_state = stack_.back().get(); if (last_state->system_state_) { mc_api::get().restore_state(last_state->system_state_); - MC_restore_communications_pattern(last_state); + restore_communications_pattern(last_state); return; } /* Restore the initial state */ mcapi::get().restore_initial_state(); - unsigned n = mcapi::get().get_maxpid(); + unsigned long n = mcapi::get().get_maxpid(); assert(n == incomplete_communications_pattern.size()); assert(n == initial_communications_pattern.size()); - for (unsigned j = 0; j < n; j++) { + for (unsigned long j = 0; j < n; j++) { incomplete_communications_pattern[j].clear(); initial_communications_pattern[j].index_comm = 0; } @@ -372,7 +379,7 @@ void CommunicationDeterminismChecker::restoreState() /* TODO : handle test and testany simcalls */ CallType call = MC_get_call_type(req); mcapi::get().handle_simcall(state->transition_); - MC_handle_comm_pattern(call, req, req_num, 1); + handle_comm_pattern(call, req, req_num, 1); mcapi::get().mc_wait_for_requests(); /* Update statistics */ @@ -381,6 +388,31 @@ void CommunicationDeterminismChecker::restoreState() } } +void CommunicationDeterminismChecker::handle_comm_pattern(simgrid::mc::CallType call_type, smx_simcall_t req, int value, int backtracking) +{ + using simgrid::mc::CallType; + switch(call_type) { + case CallType::NONE: + break; + case CallType::SEND: + case CallType::RECV: + get_comm_pattern(req, call_type, backtracking); + break; + case CallType::WAIT: + case CallType::WAITANY: { + simgrid::kernel::activity::CommImpl* comm_addr = nullptr; + if (call_type == CallType::WAIT) + comm_addr = mcapi::get().get_comm_wait_raw_addr(req); + else + comm_addr = mcapi::get().get_comm_waitany_raw_addr(req, value); + auto simcall_issuer = mcapi::get().simcall_get_issuer(req); + complete_comm_pattern(comm_addr, simcall_issuer->get_pid(), backtracking); + } break; + default: + xbt_die("Unexpected call type %i", (int)call_type); + } +} + void CommunicationDeterminismChecker::real_run() { std::unique_ptr visited_state = nullptr; @@ -422,7 +454,7 @@ void CommunicationDeterminismChecker::real_run() mcapi::get().handle_simcall(cur_state->transition_); /* After this call req is no longer useful */ - MC_handle_comm_pattern(call, req, req_num, 0); + handle_comm_pattern(call, req, req_num, 0); /* Wait for requests (schedules processes) */ mcapi::get().mc_wait_for_requests(); @@ -505,7 +537,7 @@ void CommunicationDeterminismChecker::real_run() void CommunicationDeterminismChecker::run() { XBT_INFO("Check communication determinism"); - mcapi::get().s_initialize(); + mcapi::get().session_initialize(); this->prepare(); this->real_run();