Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Various doc improvements
[simgrid.git] / src / s4u / s4u_Exec.cpp
index 2494698..caa7466 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2006-2022. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2006-2023. 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. */
@@ -6,6 +6,7 @@
 #include "simgrid/simix.hpp"
 #include <simgrid/Exception.hpp>
 #include <simgrid/exec.h>
+#include <simgrid/s4u/ActivitySet.hpp>
 #include <simgrid/s4u/Exec.hpp>
 #include <simgrid/s4u/Host.hpp>
 
@@ -16,7 +17,6 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_exec, s4u_activity, "S4U asynchronous executions");
 
 namespace simgrid::s4u {
-xbt::signal<void(Exec const&)> Exec::on_start;
 
 Exec::Exec(kernel::activity::ExecImplPtr pimpl)
 {
@@ -31,18 +31,10 @@ void Exec::reset() const
 ExecPtr Exec::init()
 {
   auto pimpl = kernel::activity::ExecImplPtr(new kernel::activity::ExecImpl());
-  unsigned int cb_id = Host::on_state_change.connect([pimpl](s4u::Host const& h) {
-    if (not h.is_on() && pimpl->get_state() == kernel::activity::State::RUNNING &&
-        std::find(pimpl->get_hosts().begin(), pimpl->get_hosts().end(), &h) != pimpl->get_hosts().end()) {
-      pimpl->set_state(kernel::activity::State::FAILED);
-      pimpl->post();
-    }
-  });
-  pimpl->set_cb_id(cb_id);
   return ExecPtr(static_cast<Exec*>(pimpl->get_iface()));
 }
 
-Exec* Exec::start()
+Exec* Exec::do_start()
 {
   kernel::actor::simcall_answered([this] {
     (*boost::static_pointer_cast<kernel::activity::ExecImpl>(pimpl_))
@@ -55,16 +47,28 @@ Exec* Exec::start()
     pimpl_->suspend();
 
   state_      = State::STARTED;
-  on_start(*this);
+  fire_on_start();
+  fire_on_this_start();
   return this;
 }
 
-ssize_t Exec::wait_any_for(const std::vector<ExecPtr>& execs, double timeout)
+ssize_t Exec::deprecated_wait_any_for(const std::vector<ExecPtr>& execs, double timeout) // XBT_ATTRIB_DEPRECATED_v339
 {
-  std::vector<ActivityPtr> activities;
+  if (execs.empty())
+    return -1;
+  ActivitySet set;
   for (const auto& exec : execs)
-    activities.push_back(boost::dynamic_pointer_cast<Activity>(exec));
-  return Activity::wait_any_for(activities, timeout);
+    set.push(exec);
+  try {
+    auto* ret = set.wait_any_for(timeout).get();
+    for (size_t i = 0; i < execs.size(); i++)
+      if (execs[i].get() == ret)
+        return i;
+
+  } catch (TimeoutException& e) {
+    return -1;
+  }
+  return -1;
 }
 
 /** @brief change the execution bound
@@ -180,8 +184,8 @@ ExecPtr Exec::set_host(Host* host)
       pimpl_.get(), [this, host] { boost::static_pointer_cast<kernel::activity::ExecImpl>(pimpl_)->set_host(host); });
 
   if (state_ == State::STARTING)
-  // Setting the host may allow to start the activity, let's try
-    vetoable_start();
+    // Setting the host may allow to start the activity, let's try
+    start();
 
   return this;
 }
@@ -198,7 +202,7 @@ ExecPtr Exec::set_hosts(const std::vector<Host*>& hosts)
 
   // Setting the host may allow to start the activity, let's try
   if (state_ == State::STARTING)
-     vetoable_start();
+     start();
 
   return this;
 }
@@ -213,7 +217,7 @@ ExecPtr Exec::unset_host()
 
     if (state_ == State::STARTED)
       cancel();
-    vetoable_start();
+    start();
 
     return this;
   }
@@ -221,7 +225,7 @@ ExecPtr Exec::unset_host()
 
 double Exec::get_cost() const
 {
-  return (pimpl_->surf_action_ == nullptr) ? -1 : pimpl_->surf_action_->get_cost();
+  return (pimpl_->model_action_ == nullptr) ? -1 : pimpl_->model_action_->get_cost();
 }
 
 double Exec::get_remaining() const
@@ -255,6 +259,11 @@ bool Exec::is_assigned() const
 } // namespace simgrid::s4u
 
 /* **************************** Public C interface *************************** */
+int sg_exec_isinstance(sg_activity_t acti)
+{
+  return dynamic_cast<simgrid::s4u::Exec*>(acti) != nullptr;
+}
+
 void sg_exec_set_bound(sg_exec_t exec, double bound)
 {
   exec->set_bound(bound);
@@ -287,7 +296,7 @@ double sg_exec_get_remaining_ratio(const_sg_exec_t exec)
 
 void sg_exec_start(sg_exec_t exec)
 {
-  exec->vetoable_start();
+  exec->start();
 }
 
 void sg_exec_cancel(sg_exec_t exec)
@@ -327,18 +336,27 @@ sg_error_t sg_exec_wait_for(sg_exec_t exec, double timeout)
   return status;
 }
 
-ssize_t sg_exec_wait_any(sg_exec_t* execs, size_t count)
+ssize_t sg_exec_wait_any(sg_exec_t* execs, size_t count) // XBT_ATTRIB_DEPRECATED_v339
 {
-  return sg_exec_wait_any_for(execs, count, -1.0);
+  std::vector<simgrid::s4u::ExecPtr> s4u_execs;
+  for (size_t i = 0; i < count; i++)
+    s4u_execs.emplace_back(execs[i], false);
+
+  ssize_t pos = simgrid::s4u::Exec::deprecated_wait_any_for(s4u_execs, -1.0);
+  for (size_t i = 0; i < count; i++) {
+    if (pos != -1 && static_cast<size_t>(pos) != i)
+      s4u_execs[i]->add_ref();
+  }
+  return pos;
 }
 
-ssize_t sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout)
+ssize_t sg_exec_wait_any_for(sg_exec_t* execs, size_t count, double timeout) // XBT_ATTRIB_DEPRECATED_v339
 {
   std::vector<simgrid::s4u::ExecPtr> s4u_execs;
   for (size_t i = 0; i < count; i++)
     s4u_execs.emplace_back(execs[i], false);
 
-  ssize_t pos = simgrid::s4u::Exec::wait_any_for(s4u_execs, timeout);
+  ssize_t pos = simgrid::s4u::Exec::deprecated_wait_any_for(s4u_execs, timeout);
   for (size_t i = 0; i < count; i++) {
     if (pos != -1 && static_cast<size_t>(pos) != i)
       s4u_execs[i]->add_ref();