X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9303a93b4bbd12f4d20f674577b2e10c3eb21eea..934f086b51d328c46cb8fb20db2ad3efd4668ac9:/src/mc/remote/AppSide.cpp diff --git a/src/mc/remote/AppSide.cpp b/src/mc/remote/AppSide.cpp index 259155ace1..e56a85476d 100644 --- a/src/mc/remote/AppSide.cpp +++ b/src/mc/remote/AppSide.cpp @@ -98,21 +98,31 @@ void AppSide::handle_simcall_execute(const s_mc_message_simcall_execute_t* messa { kernel::actor::ActorImpl* actor = kernel::actor::ActorImpl::by_pid(message->aid_); xbt_assert(actor != nullptr, "Invalid pid %ld", message->aid_); - simgrid::kernel::actor::SimcallObserver* observer = nullptr; - if (actor->simcall_.observer_ != nullptr) { - observer = actor->simcall_.observer_->clone(); - actor->observer_stack_.push_back(observer); - } - // Finish the RPC from the server: we need to return a pointer to the observer, saved in a stable storage - s_mc_message_simcall_execute_answer_t answer{MessageType::SIMCALL_EXECUTE_ANSWER, observer}; - XBT_DEBUG("send SIMCALL_EXECUTE_ANSWER(%p)", observer); - xbt_assert(channel_.send(answer) == 0, "Could not send response"); // The client may send some messages to the server while processing the transition actor->simcall_handle(message->times_considered_); - // Say the server that the transition is over and that it should proceed xbt_assert(channel_.send(MessageType::WAITING) == 0, "Could not send MESSAGE_WAITING to model-checker"); + + // Finish the RPC from the server: return a serialized observer, to build a Transition on Checker side + s_mc_message_simcall_execute_answer_t answer; + memset(&answer, 0, sizeof(answer)); + answer.type = MessageType::SIMCALL_EXECUTE_ANSWER; + std::stringstream stream; + if (actor->simcall_.observer_ != nullptr) { + actor->simcall_.observer_->serialize(stream); + } else { + stream << (short)mc::Transition::Type::UNKNOWN; + } + std::string str = stream.str(); + xbt_assert(str.size() + 1 <= answer.buffer.size(), + "The serialized simcall is too large for the buffer. Please fix the code."); + strncpy(answer.buffer.data(), str.c_str(), answer.buffer.size() - 1); + answer.buffer.back() = '\0'; + + XBT_DEBUG("send SIMCALL_EXECUTE_ANSWER(%s) ~> '%s'", actor->get_cname(), str.c_str()); + xbt_assert(channel_.send(answer) == 0, "Could not send response"); + } void AppSide::handle_actor_enabled(const s_mc_message_actor_enabled_t* msg) const @@ -167,64 +177,6 @@ void AppSide::handle_messages() const break; } - case MessageType::SIMCALL_TO_STRING: { - assert_msg_size("SIMCALL_TO_STRING", s_mc_message_simcall_to_string_t); - auto msg_simcall = (s_mc_message_simcall_to_string_t*)message_buffer.data(); - const kernel::actor::ActorImpl* actor = kernel::actor::ActorImpl::by_pid(msg_simcall->aid); - xbt_assert(actor != nullptr, "Invalid pid %ld", msg_simcall->aid); - xbt_assert(actor->simcall_.observer_, "The transition of %s has no observer", actor->get_cname()); - std::string value = ""; - if (actor->simcall_.observer_ != nullptr) - value = actor->simcall_.observer_->to_string(msg_simcall->time_considered); - else - value = "[(" + std::to_string(actor->get_pid()) + ")" + actor->get_host()->get_cname() + " (" + - actor->get_cname() + ")] " + SIMIX_simcall_name(actor->simcall_) + "(unknown?)"; - - // Send result: - s_mc_message_simcall_to_string_answer_t answer{MessageType::SIMCALL_TO_STRING_ANSWER, {0}}; - value.copy(answer.value, (sizeof answer.value) - 1); // last byte was set to '\0' by initialization above - xbt_assert(channel_.send(answer) == 0, "Could not send response"); - break; - } - - case MessageType::SIMCALL_DOT_LABEL: { - assert_msg_size("SIMCALL_DOT_LABEL", s_mc_message_simcall_to_string_t); - auto msg_simcall = (s_mc_message_simcall_to_string_t*)message_buffer.data(); - const kernel::actor::ActorImpl* actor = kernel::actor::ActorImpl::by_pid(msg_simcall->aid); - xbt_assert(actor != nullptr, "Invalid pid %ld", msg_simcall->aid); - std::string value = ""; - if (actor->simcall_.observer_ != nullptr) - value = actor->simcall_.observer_->dot_label(msg_simcall->time_considered); - else - value = "UNIMPLEMENTED"; - - // Send result: - s_mc_message_simcall_to_string_answer_t answer{MessageType::SIMCALL_TO_STRING_ANSWER, {0}}; - value.copy(answer.value, (sizeof answer.value) - 1); // last byte was set to '\0' by initialization above - xbt_assert(channel_.send(answer) == 0, "Could not send response"); - break; - } - - case MessageType::SIMCALLS_DEPENDENT: { - assert_msg_size("SIMCALLS_DEPENDENT", s_mc_message_simcalls_dependent_t); - auto msg_simcalls = (s_mc_message_simcalls_dependent_t*)message_buffer.data(); - auto* obs1 = msg_simcalls->obs1; - auto* obs2 = msg_simcalls->obs2; - bool res = true; - - if (obs1 != nullptr && obs2 != nullptr) - res = obs1->depends(obs2); - - XBT_DEBUG("return SIMCALLS_DEPENDENT(%s, %s) = %s", obs1->to_string(0).c_str(), obs2->to_string(0).c_str(), - (res ? "true" : "false")); - - // Send result: - s_mc_message_simcalls_dependent_answer_t answer{MessageType::SIMCALLS_DEPENDENT_ANSWER, 0}; - answer.value = res; - xbt_assert(channel_.send(answer) == 0, "Could not send response"); - break; - } - case MessageType::ACTOR_ENABLED: assert_msg_size("ACTOR_ENABLED", s_mc_message_actor_enabled_t); handle_actor_enabled((s_mc_message_actor_enabled_t*)message_buffer.data());