Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Allow to call test() on canceled activities.
[simgrid.git] / src / s4u / s4u_Activity.cpp
index 374eaea..f1a24ae 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "simgrid/s4u/Activity.hpp"
 #include "simgrid/s4u/Engine.hpp"
+#include "src/kernel/activity/ActivityImpl.hpp"
 
 XBT_LOG_EXTERNAL_CATEGORY(s4u);
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_activity, s4u, "S4U activities");
@@ -21,7 +22,27 @@ void Activity::wait_until(double time_limit)
     wait_for(time_limit - now);
 }
 
-double Activity::get_remaining()
+bool Activity::test()
+{
+  xbt_assert(state_ == State::INITED || state_ == State::STARTED || state_ == State::STARTING ||
+             state_ == State::CANCELED || state_ == State::FINISHED);
+
+  if (state_ == State::CANCELED || state_ == State::FINISHED)
+    return true;
+
+  if (state_ == State::INITED || state_ == State::STARTING)
+    this->vetoable_start();
+
+  if (kernel::actor::simcall([this] { return this->get_impl()->test(); })) {
+    state_ = State::FINISHED;
+    this->release_dependencies();
+    return true;
+  }
+
+  return false;
+}
+
+double Activity::get_remaining() const
 {
   return remains_;
 }