X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ab209b5fb2592a3287497a9ea08773471005192f..285132b31c7186e9b1d67b2ce96b02d216886a9f:/src/mc/api/RemoteApp.cpp diff --git a/src/mc/api/RemoteApp.cpp b/src/mc/api/RemoteApp.cpp index b56d54d472..ee1627feda 100644 --- a/src/mc/api/RemoteApp.cpp +++ b/src/mc/api/RemoteApp.cpp @@ -168,10 +168,7 @@ void RemoteApp::get_actors_status(std::map& whereto) const // <----- send ACTORS_STATUS_REPLY // <----- send `N` `s_mc_message_actors_status_one_t` structs // <----- send `M` `s_mc_message_simcall_probe_one_t` structs - s_mc_message_t msg; - memset(&msg, 0, sizeof msg); - msg.type = simgrid::mc::MessageType::ACTORS_STATUS; - model_checker_->channel().send(msg); + model_checker_->channel().send(MessageType::ACTORS_STATUS); s_mc_message_actors_status_answer_t answer; ssize_t received = model_checker_->channel().receive(answer); @@ -182,31 +179,44 @@ void RemoteApp::get_actors_status(std::map& whereto) const to_c_str(answer.type), (int)answer.type, (int)received, (int)MessageType::ACTORS_STATUS_REPLY, (int)sizeof(answer)); + // Message sanity checks + xbt_assert(answer.count >= 0, "Received an ACTOR_STATUS_REPLY message with an actor count of '%d' < 0", answer.count); + xbt_assert(answer.transition_count >= 0, "Received an ACTOR_STATUS_REPLY message with transition_count '%d' < 0", + answer.transition_count); + xbt_assert(answer.transition_count == 0 || answer.count >= 0, + "Received an ACTOR_STATUS_REPLY message with no actor data " + "but with transition data nonetheless"); + std::vector status(answer.count); if (answer.count > 0) { - size_t size = status.size() * sizeof(s_mc_message_actors_status_one_t); - received = model_checker_->channel().receive(status.data(), size); - xbt_assert(static_cast(received) == size); - } - - std::vector action_pool(answer.transition_count); - if (answer.transition_count > 0) { - size_t size = action_pool.size() * sizeof(s_mc_message_simcall_probe_one_t); - received = model_checker_->channel().receive(action_pool.data(), size); + size_t size = status.size() * sizeof(s_mc_message_actors_status_one_t); + ssize_t received = model_checker_->channel().receive(status.data(), size); xbt_assert(static_cast(received) == size); } - // Ensures that each actor sends precisely `actor.max_considered` transitions. While technically + // Ensures that each actor sends precisely `answer.transition_count` transitions. While technically // this doesn't catch the edge case where actor A sends 3 instead of 2 and actor B sends 2 instead // of 3 transitions, that is ignored here since that invariant needs to be enforced on the AppSide const auto expected_transitions = std::accumulate( status.begin(), status.end(), 0, [](int total, const auto& actor) { return total + actor.n_transitions; }); - xbt_assert(expected_transitions == action_pool.size(), - "Expected to receive %d transition(s) but was only notified of %lu by the app side", expected_transitions, - action_pool.size()); + xbt_assert(expected_transitions == answer.transition_count, + "Expected to receive %d transition(s) but was only notified of %d by the app side", expected_transitions, + answer.transition_count); + + std::vector probes(answer.transition_count); + if (answer.transition_count > 0) { + for (auto& probe : probes) { + size_t size = sizeof(s_mc_message_simcall_probe_one_t); + ssize_t received = model_checker_->channel().receive(&probe, size); + xbt_assert(received >= 0, "Could not receive response to ACTORS_PROBE message (%s)", strerror(errno)); + xbt_assert(static_cast(received) == size, + "Could not receive response to ACTORS_PROBE message (%zd bytes received != %zu bytes expected", + received, size); + } + } whereto.clear(); - auto action_pool_iter = std::move_iterator(action_pool.begin()); + auto probes_iter = std::move_iterator(probes.begin()); for (const auto& actor : status) { xbt_assert(actor.n_transitions == 0 || actor.n_transitions == actor.max_considered, @@ -215,14 +225,14 @@ void RemoteApp::get_actors_status(std::map& whereto) const "(currently %d), but only %d transition(s) was/were said to be encoded", actor.max_considered, actor.n_transitions); - std::stringstream stream((*action_pool_iter).buffer.data()); - auto actor_transitions = std::vector>(actor.max_considered); - - for (int times_considered = 0; times_considered < actor.max_considered; times_considered++, action_pool_iter++) { - auto transition = std::unique_ptr(deserialize_transition(actor.aid, times_considered, stream)); - actor_transitions.push_back(std::move(transition)); + auto actor_transitions = std::vector>(actor.n_transitions); + for (int times_considered = 0; times_considered < actor.n_transitions; times_considered++, probes_iter++) { + std::stringstream stream((*probes_iter).buffer.data()); + auto transition = std::shared_ptr(deserialize_transition(actor.aid, times_considered, stream)); + actor_transitions[times_considered] = std::move(transition); } + XBT_DEBUG("Received %d transitions for actor %ld", actor.n_transitions, actor.aid); whereto.try_emplace(actor.aid, actor.aid, actor.enabled, actor.max_considered, std::move(actor_transitions)); } }