Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Don't compute the dependencies locally in the checker, but through the observers...
[simgrid.git] / src / kernel / actor / SimcallObserver.cpp
index 458135a..8d13441 100644 (file)
@@ -318,12 +318,15 @@ bool ActivityWaitSimcall::depends(SimcallObserver* other)
 
   return true;
 }
+
 std::string ActivityWaitSimcall::to_string(int times_considered) const
 {
   std::string res = SimcallObserver::to_string(times_considered);
   auto* comm      = dynamic_cast<activity::CommImpl*>(activity_);
-  if (comm == nullptr)
-    xbt_die("Only Comms are supported here for now");
+  if (comm == nullptr) {
+    res += "ActivityWait on non-Comm (FIXME)"; // FIXME
+    return res;
+  }
 
   if (times_considered == -1) {
     res += "WaitTimeout(comm=" + (XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose)
@@ -410,6 +413,112 @@ std::string ActivityWaitanySimcall::to_string(int times_considered) const
   return res;
 }
 
+bool CommIsendSimcall::depends(SimcallObserver* other)
+{
+  if (get_issuer() == other->get_issuer())
+    return false;
+
+  if (auto* other_isend = dynamic_cast<CommIsendSimcall*>(other))
+    return mbox_ == other_isend->get_mailbox();
+
+  // FIXME: Not in the former dependency check because of the ordering but seems logical to add it
+  if (dynamic_cast<CommIrecvSimcall*>(other) != nullptr)
+    return false;
+
+#if SIMGRID_HAVE_MC // FIXME needed to access mbox_cpy
+  if (auto* wait = dynamic_cast<ActivityWaitSimcall*>(other)) {
+    if (auto* comm2 = dynamic_cast<activity::CommImpl*>(wait->get_activity())) { // this is a Comm::wait_for
+      auto* mbox1 = mbox_;
+      auto* mbox2 = comm2->mbox_cpy;
+
+      if (mbox1 != mbox2 && wait->get_timeout() <= 0)
+        return false;
+
+      if ((get_issuer() != comm2->src_actor_.get()) && (get_issuer() != comm2->dst_actor_.get()) &&
+          wait->get_timeout() <= 0)
+        return false;
+
+      if (comm2->type_ == activity::CommImpl::Type::SEND && comm2->src_buff_ != src_buff_ && wait->get_timeout() <= 0)
+        return false;
+    }
+  }
+#endif
+  /* FIXME: the following rule assumes that the result of the isend/irecv call is not stored in a buffer used in the
+   * test call. */
+#if 0
+  if (dynamic_cast<ActivityTestSimcall*>(other))
+    return false;
+#endif
+
+  return true;
+}
+
+std::string CommIsendSimcall::to_string(int times_considered) const
+{
+  std::string res = SimcallObserver::to_string(times_considered) + "iSend(";
+  res += xbt::string_printf("src=[(%ld)%s (%s)]", get_issuer()->get_pid(), get_issuer()->get_host()->get_cname(),
+                            get_issuer()->get_cname());
+  res += XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? xbt::string_printf(", buff=%p", src_buff_)
+                                                                  : "(verbose only)";
+  res += ", size=" +
+         (XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? std::to_string(src_buff_size_) : "(verbose only)");
+  res += ")";
+  return res;
+}
+
+bool CommIrecvSimcall::depends(SimcallObserver* other)
+{
+  if (get_issuer() == other->get_issuer())
+    return false;
+
+  if (auto* other_irecv = dynamic_cast<CommIrecvSimcall*>(other))
+    return mbox_ == other_irecv->get_mailbox();
+
+  if (dynamic_cast<CommIsendSimcall*>(other) != nullptr)
+    return false;
+
+#if SIMGRID_HAVE_MC // FIXME needed to access mbox_cpy
+  if (auto* wait = dynamic_cast<ActivityWaitSimcall*>(other)) {
+    if (auto* comm2 = dynamic_cast<activity::CommImpl*>(wait->get_activity())) { // this is a Comm::wait_for
+      auto* mbox1 = mbox_;
+      auto* mbox2 = comm2->mbox_cpy;
+
+      if (mbox1 != mbox2 && wait->get_timeout() <= 0)
+        return false;
+
+      if ((get_issuer() != comm2->src_actor_.get()) && (get_issuer() != comm2->dst_actor_.get()) &&
+          wait->get_timeout() <= 0)
+        return false;
+
+      if (comm2->type_ == activity::CommImpl::Type::RECEIVE && comm2->dst_buff_ != dst_buff_ &&
+          wait->get_timeout() <= 0)
+        return false;
+    }
+  }
+#endif
+  /* FIXME: the following rule assumes that the result of the isend/irecv call is not stored in a buffer used in the
+   * test call. */
+#if 0
+  if (dynamic_cast<ActivityTestSimcall*>(other))
+    return false;
+#endif
+
+  return true;
+}
+
+std::string CommIrecvSimcall::to_string(int times_considered) const
+{
+  std::string res = SimcallObserver::to_string(times_considered) + "iRecv(";
+  res += xbt::string_printf("dst=[(%ld)%s (%s)]", get_issuer()->get_pid(), get_issuer()->get_host()->get_cname(),
+                            get_issuer()->get_cname());
+  res += XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? xbt::string_printf(", buff=%p", dst_buff_)
+                                                                  : "(verbose only)";
+  res += ", size=" + (XBT_LOG_ISENABLED(mc_observer, xbt_log_priority_verbose) ? std::to_string(*dst_buff_size_)
+                                                                               : "(verbose only)");
+  res += ")";
+  return res;
+}
+
 } // namespace actor
 } // namespace kernel
 } // namespace simgrid