Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update copyright lines for 2022.
[simgrid.git] / src / kernel / activity / CommImpl.cpp
index ebb179b..6f2f9e0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2007-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. */
@@ -12,8 +12,9 @@
 #include "src/kernel/activity/MailboxImpl.hpp"
 #include "src/kernel/context/Context.hpp"
 #include "src/kernel/resource/CpuImpl.hpp"
+#include "src/kernel/resource/LinkImpl.hpp"
+#include "src/kernel/resource/StandardLinkImpl.hpp"
 #include "src/mc/mc_replay.hpp"
-#include "src/surf/network_interface.hpp"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_network, simix, "SIMIX network-related synchronization");
 
@@ -310,6 +311,7 @@ CommImpl* CommImpl::start()
     surf_action_ = net_model->communicate(from_, to_, size_, rate_);
     surf_action_->set_activity(this);
     surf_action_->set_category(get_tracing_category());
+    start_time_ = surf_action_->get_start_time();
     state_ = State::RUNNING;
     on_start(*this);
 
@@ -556,6 +558,70 @@ void CommImpl::post()
   /* Answer all simcalls associated with the synchro */
   finish();
 }
+void CommImpl::set_exception(actor::ActorImpl* issuer)
+{
+  switch (state_) {
+    case State::FAILED:
+      issuer->exception_ = std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
+      break;
+    case State::SRC_TIMEOUT:
+      issuer->exception_ =
+          std::make_exception_ptr(TimeoutException(XBT_THROW_POINT, "Communication timeouted because of the sender"));
+      break;
+
+    case State::DST_TIMEOUT:
+      issuer->exception_ =
+          std::make_exception_ptr(TimeoutException(XBT_THROW_POINT, "Communication timeouted because of the receiver"));
+      break;
+
+    case State::SRC_HOST_FAILURE:
+      if (issuer == src_actor_)
+        issuer->context_->set_wannadie();
+      else {
+        state_             = kernel::activity::State::FAILED;
+        issuer->exception_ = std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
+      }
+      break;
+
+    case State::DST_HOST_FAILURE:
+      if (issuer == dst_actor_)
+        issuer->context_->set_wannadie();
+      else {
+        state_             = kernel::activity::State::FAILED;
+        issuer->exception_ = std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
+      }
+      break;
+
+    case State::LINK_FAILURE:
+      XBT_DEBUG("Link failure in synchro %p between '%s' and '%s': posting an exception to the issuer: %s (%p) "
+                "detached:%d",
+                this, src_actor_ ? src_actor_->get_host()->get_cname() : nullptr,
+                dst_actor_ ? dst_actor_->get_host()->get_cname() : nullptr, issuer->get_cname(), issuer, detached_);
+      if (src_actor_ == issuer) {
+        XBT_DEBUG("I'm source");
+      } else if (dst_actor_ == issuer) {
+        XBT_DEBUG("I'm dest");
+      } else {
+        XBT_DEBUG("I'm neither source nor dest");
+      }
+      state_ = kernel::activity::State::FAILED;
+      issuer->throw_exception(std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Link failure")));
+      break;
+
+    case State::CANCELED:
+      if (issuer == dst_actor_)
+        issuer->exception_ =
+            std::make_exception_ptr(CancelException(XBT_THROW_POINT, "Communication canceled by the sender"));
+      else
+        issuer->exception_ =
+            std::make_exception_ptr(CancelException(XBT_THROW_POINT, "Communication canceled by the receiver"));
+      break;
+
+    default:
+      xbt_assert(state_ == State::DONE, "Internal error in CommImpl::finish(): unexpected synchro state %s",
+                 to_c_str(state_));
+  }
+}
 
 void CommImpl::finish()
 {
@@ -598,72 +664,7 @@ void CommImpl::finish()
     if (not simcall->issuer_->get_host()->is_on()) {
       simcall->issuer_->context_->set_wannadie();
     } else {
-      switch (state_) {
-        case State::FAILED:
-          simcall->issuer_->exception_ =
-              std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
-          break;
-        case State::SRC_TIMEOUT:
-          simcall->issuer_->exception_ = std::make_exception_ptr(
-              TimeoutException(XBT_THROW_POINT, "Communication timeouted because of the sender"));
-          break;
-
-        case State::DST_TIMEOUT:
-          simcall->issuer_->exception_ = std::make_exception_ptr(
-              TimeoutException(XBT_THROW_POINT, "Communication timeouted because of the receiver"));
-          break;
-
-        case State::SRC_HOST_FAILURE:
-          if (simcall->issuer_ == src_actor_)
-            simcall->issuer_->context_->set_wannadie();
-          else {
-            state_ = kernel::activity::State::FAILED;
-            simcall->issuer_->exception_ =
-                std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
-          }
-          break;
-
-        case State::DST_HOST_FAILURE:
-          if (simcall->issuer_ == dst_actor_)
-            simcall->issuer_->context_->set_wannadie();
-          else {
-            state_ = kernel::activity::State::FAILED;
-            simcall->issuer_->exception_ =
-                std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Remote peer failed"));
-          }
-          break;
-
-        case State::LINK_FAILURE:
-          XBT_DEBUG("Link failure in synchro %p between '%s' and '%s': posting an exception to the issuer: %s (%p) "
-                    "detached:%d",
-                    this, src_actor_ ? src_actor_->get_host()->get_cname() : nullptr,
-                    dst_actor_ ? dst_actor_->get_host()->get_cname() : nullptr, simcall->issuer_->get_cname(),
-                    simcall->issuer_, detached_);
-          if (src_actor_ == simcall->issuer_) {
-            XBT_DEBUG("I'm source");
-          } else if (dst_actor_ == simcall->issuer_) {
-            XBT_DEBUG("I'm dest");
-          } else {
-            XBT_DEBUG("I'm neither source nor dest");
-          }
-          state_ = kernel::activity::State::FAILED;
-          simcall->issuer_->throw_exception(
-              std::make_exception_ptr(NetworkFailureException(XBT_THROW_POINT, "Link failure")));
-          break;
-
-        case State::CANCELED:
-          if (simcall->issuer_ == dst_actor_)
-            simcall->issuer_->exception_ =
-                std::make_exception_ptr(CancelException(XBT_THROW_POINT, "Communication canceled by the sender"));
-          else
-            simcall->issuer_->exception_ =
-                std::make_exception_ptr(CancelException(XBT_THROW_POINT, "Communication canceled by the receiver"));
-          break;
-
-        default:
-          xbt_assert(state_ == State::DONE, "Internal error in CommImpl::finish(): unexpected synchro state %s",
-                     to_c_str(state_));
-      }
+      set_exception(simcall->issuer_);
       simcall->issuer_->simcall_answer();
     }
     /* if there is an exception during a waitany or a testany, indicate the position of the failed communication */