From 06bb77be33c8d02b792f74e0a87110e3b0989c50 Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Thu, 16 Aug 2018 06:35:25 +0200 Subject: [PATCH] add minimal signals to trace Comm --- include/simgrid/s4u/Activity.hpp | 1 + include/simgrid/s4u/Comm.hpp | 4 ++++ src/instr/instr_platform.cpp | 10 ++++++++++ src/s4u/s4u_Comm.cpp | 10 ++++++++++ 4 files changed, 25 insertions(+) diff --git a/include/simgrid/s4u/Activity.hpp b/include/simgrid/s4u/Activity.hpp index 6cd6276393..cb8bcc8e24 100644 --- a/include/simgrid/s4u/Activity.hpp +++ b/include/simgrid/s4u/Activity.hpp @@ -7,6 +7,7 @@ #define SIMGRID_S4U_ACTIVITY_HPP #include +#include namespace simgrid { namespace s4u { diff --git a/include/simgrid/s4u/Comm.hpp b/include/simgrid/s4u/Comm.hpp index dd24d5171c..71a38a8f84 100644 --- a/include/simgrid/s4u/Comm.hpp +++ b/include/simgrid/s4u/Comm.hpp @@ -27,6 +27,10 @@ public: virtual ~Comm(); + static simgrid::xbt::signal on_sender_start; + static simgrid::xbt::signal on_receiver_start; + static simgrid::xbt::signal on_completion; + /*! take a vector s4u::CommPtr and return when one of them is finished. * The return value is the rank of the first finished CommPtr. */ static int wait_any(std::vector * comms) { return wait_any_for(comms, -1); } diff --git a/src/instr/instr_platform.cpp b/src/instr/instr_platform.cpp index 244240c1a6..1901f25bcb 100644 --- a/src/instr/instr_platform.cpp +++ b/src/instr/instr_platform.cpp @@ -8,6 +8,7 @@ #include "simgrid/kernel/routing/NetPoint.hpp" #include "simgrid/kernel/routing/NetZoneImpl.hpp" #include "simgrid/s4u/Actor.hpp" +#include "simgrid/s4u/Comm.hpp" #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Exec.hpp" #include "simgrid/s4u/Host.hpp" @@ -389,6 +390,15 @@ void instr_define_callbacks() simgrid::s4u::Exec::on_completion.connect([](simgrid::s4u::ActorPtr actor) { simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->pop_event(); }); + simgrid::s4u::Comm::on_sender_start.connect([](simgrid::s4u::ActorPtr actor) { + simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->push_event("send"); + }); + simgrid::s4u::Comm::on_receiver_start.connect([](simgrid::s4u::ActorPtr actor) { + simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->push_event("receive"); + }); + simgrid::s4u::Comm::on_completion.connect([](simgrid::s4u::ActorPtr actor) { + simgrid::instr::Container::by_name(instr_pid(actor.get()))->get_state("ACTOR_STATE")->pop_event(); + }); simgrid::s4u::Actor::on_migration_start.connect(instr_actor_on_migration_start); simgrid::s4u::Actor::on_migration_end.connect(instr_actor_on_migration_end); } diff --git a/src/s4u/s4u_Comm.cpp b/src/s4u/s4u_Comm.cpp index 0b57262abd..bebc91b952 100644 --- a/src/s4u/s4u_Comm.cpp +++ b/src/s4u/s4u_Comm.cpp @@ -13,6 +13,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_comm, s4u_activity, "S4U asynchronous commun namespace simgrid { namespace s4u { +simgrid::xbt::signal s4u::Comm::on_sender_start; +simgrid::xbt::signal s4u::Comm::on_receiver_start; +simgrid::xbt::signal s4u::Comm::on_completion; + Comm::~Comm() { if (state_ == State::STARTED && not detached_ && (pimpl_ == nullptr || pimpl_->state_ == SIMIX_RUNNING)) { @@ -110,10 +114,12 @@ Activity* Comm::start() xbt_assert(state_ == State::INITED); if (src_buff_ != nullptr) { // Sender side + on_sender_start(Actor::self()); pimpl_ = simcall_comm_isend(sender_, mailbox_->get_impl(), remains_, rate_, src_buff_, src_buff_size_, match_fun_, clean_fun_, copy_data_function_, user_data_, detached_); } else if (dst_buff_ != nullptr) { // Receiver side xbt_assert(not detached_, "Receive cannot be detached"); + on_receiver_start(Actor::self()); pimpl_ = simcall_comm_irecv(receiver_, mailbox_->get_impl(), dst_buff_, &dst_buff_size_, match_fun_, copy_data_function_, user_data_, rate_); @@ -144,9 +150,12 @@ Activity* Comm::wait(double timeout) case State::INITED: // It's not started yet. Do it in one simcall if (src_buff_ != nullptr) { + on_sender_start(Actor::self()); simcall_comm_send(sender_, mailbox_->get_impl(), remains_, rate_, src_buff_, src_buff_size_, match_fun_, copy_data_function_, user_data_, timeout); + } else { // Receiver + on_receiver_start(Actor::self()); simcall_comm_recv(receiver_, mailbox_->get_impl(), dst_buff_, &dst_buff_size_, match_fun_, copy_data_function_, user_data_, timeout, rate_); } @@ -155,6 +164,7 @@ Activity* Comm::wait(double timeout) case State::STARTED: simcall_comm_wait(pimpl_, timeout); + on_completion(Actor::self()); state_ = State::FINISHED; return this; -- 2.20.1