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 9ef1d5f..f1a24ae 100644 (file)
@@ -1,13 +1,13 @@
-/* Copyright (c) 2006-2018. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2006-2020. 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. */
 
-#include "xbt/asserts.h"
 #include "xbt/log.h"
 
 #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");
@@ -15,7 +15,34 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_activity, s4u, "S4U activities");
 namespace simgrid {
 namespace s4u {
 
-double Activity::get_remaining()
+void Activity::wait_until(double time_limit)
+{
+  double now = Engine::get_clock();
+  if (time_limit > now)
+    wait_for(time_limit - now);
+}
+
+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_;
 }