Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update copyright lines for 2022.
[simgrid.git] / src / s4u / s4u_Comm.cpp
index c58896f..aed48fd 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2021. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2006-2022. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
@@ -23,12 +23,6 @@ xbt::signal<void(Comm const&)> Comm::on_send;
 xbt::signal<void(Comm const&)> Comm::on_recv;
 xbt::signal<void(Comm const&)> Comm::on_completion;
 
-void Comm::complete(Activity::State state)
-{
-  Activity::complete(state);
-  on_completion(*this);
-}
-
 Comm::~Comm()
 {
   if (state_ == State::STARTED && not detached_ &&
@@ -91,6 +85,28 @@ size_t Comm::wait_all_for(const std::vector<CommPtr>& comms, double timeout)
   return comms.size();
 }
 
+CommPtr Comm::set_source(Host* from)
+{
+  xbt_assert(state_ == State::INITED || state_ == State::STARTING,
+             "Cannot change the source of a Comm once it's started (state: %s)", to_c_str(state_));
+  from_ = from;
+  // Setting 'from_' may allow to start the activity, let's try
+  vetoable_start();
+
+  return this;
+}
+
+CommPtr Comm::set_destination(Host* to)
+{
+  xbt_assert(state_ == State::INITED || state_ == State::STARTING,
+             "Cannot change the destination of a Comm once it's started (state: %s)", to_c_str(state_));
+  to_ = to;
+  // Setting 'to_' may allow to start the activity, let's try
+  vetoable_start();
+
+  return this;
+}
+
 CommPtr Comm::set_rate(double rate)
 {
   xbt_assert(state_ == State::INITED, "You cannot use %s() once your communication started (not implemented)",
@@ -160,9 +176,16 @@ CommPtr Comm::set_payload_size(uint64_t bytes)
   return this;
 }
 
-CommPtr Comm::sendto_init(Host* from, Host* to)
+CommPtr Comm::sendto_init()
 {
   CommPtr res(new Comm());
+  res->sender_ = kernel::actor::ActorImpl::self();
+  return res;
+}
+
+CommPtr Comm::sendto_init(Host* from, Host* to)
+{
+  auto res   = Comm::sendto_init();
   res->from_ = from;
   res->to_   = to;
 
@@ -212,8 +235,11 @@ Comm* Comm::start()
   if (suspended_)
     pimpl_->suspend();
 
-  if (not detached_)
-    static_cast<kernel::activity::CommImpl*>(pimpl_.get())->set_iface(this);
+  if (not detached_) {
+    pimpl_->set_iface(this);
+    pimpl_->set_actor(sender_);
+  }
+
   state_ = State::STARTED;
   return this;
 }