Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add minimal signals to trace Comm
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 16 Aug 2018 04:35:25 +0000 (06:35 +0200)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 16 Aug 2018 04:35:25 +0000 (06:35 +0200)
include/simgrid/s4u/Activity.hpp
include/simgrid/s4u/Comm.hpp
src/instr/instr_platform.cpp
src/s4u/s4u_Comm.cpp

index 6cd6276..cb8bcc8 100644 (file)
@@ -7,6 +7,7 @@
 #define SIMGRID_S4U_ACTIVITY_HPP
 
 #include <simgrid/forward.h>
+#include <xbt/signal.hpp>
 
 namespace simgrid {
 namespace s4u {
index dd24d51..71a38a8 100644 (file)
@@ -27,6 +27,10 @@ public:
 
   virtual ~Comm();
 
+  static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> on_sender_start;
+  static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> on_receiver_start;
+  static simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> 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<CommPtr> * comms) { return wait_any_for(comms, -1); }
index 244240c..1901f25 100644 (file)
@@ -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);
   }
index 0b57262..bebc91b 100644 (file)
@@ -13,6 +13,10 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_comm, s4u_activity, "S4U asynchronous commun
 
 namespace simgrid {
 namespace s4u {
+simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Comm::on_sender_start;
+simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> s4u::Comm::on_receiver_start;
+simgrid::xbt::signal<void(simgrid::s4u::ActorPtr)> 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;