Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
XBT_PUBLIC on FutureBase::schedule() method
[simgrid.git] / include / simgrid / kernel / future.hpp
index cedfd39..7d94a97 100644 (file)
@@ -7,19 +7,17 @@
 #ifndef SIMGRID_KERNEL_FUTURE_HPP
 #define SIMGRID_KERNEL_FUTURE_HPP
 
+#include <functional>
 #include <future>
+#include <memory>
+#include <utility>
 #include <type_traits>
 
 #include <boost/optional.hpp>
 
 #include <xbt/base.h>
 #include <xbt/functional.hpp>
-
-#include <functional>
-#include <future>
-#include <memory>
-#include <utility>
-#include <type_traits>
+#include <xbt/future.hpp>
 
 namespace simgrid {
 namespace kernel {
@@ -39,9 +37,9 @@ enum class FutureStatus {
 };
 
 template<class T>
-struct is_future : public std::integral_constant<bool, false> {};
+struct is_future : std::false_type {};
 template<class T>
-struct is_future<Future<T>> : public std::integral_constant<bool, true> {};
+struct is_future<Future<T>> : std::true_type {};
 
 /** Bases stuff for all @ref simgrid::kernel::FutureState<T> */
 class FutureStateBase {
@@ -50,6 +48,8 @@ public:
   FutureStateBase(FutureStateBase const&) = delete;
   FutureStateBase& operator=(FutureStateBase const&) = delete;
 
+  XBT_PUBLIC(void) schedule(simgrid::xbt::Task<void()>&& job);
+
   void set_exception(std::exception_ptr exception)
   {
     xbt_assert(exception_ == nullptr);
@@ -59,7 +59,7 @@ public:
     this->set_ready();
   }
 
-  void set_continuation(simgrid::xbt::Task<void()> continuation)
+  void set_continuation(simgrid::xbt::Task<void()>&& continuation)
   {
     xbt_assert(!continuation_);
     switch (status_) {
@@ -71,7 +71,7 @@ public:
     case FutureStatus::ready:
       // The future is ready, execute the continuation directly.
       // We might execute it from the event loop instead:
-      continuation();
+      schedule(std::move(continuation));
       break;
     case FutureStatus::not_ready:
       // The future is not ready so we mast keep the continuation for
@@ -106,7 +106,7 @@ protected:
       // We need to do this becase the current implementation of the
       // continuation has a shared_ptr to the FutureState.
       auto continuation = std::move(continuation_);
-      continuation();
+      this->schedule(std::move(continuation));
     }
   }