X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c3afdfa7a603897d1fbca56e7d1705983038405e..e44a0d71a8bacd7ab03e284fc32ad23731f5869c:/include/simgrid/kernel/future.hpp diff --git a/include/simgrid/kernel/future.hpp b/include/simgrid/kernel/future.hpp index cedfd39c96..581db40333 100644 --- a/include/simgrid/kernel/future.hpp +++ b/include/simgrid/kernel/future.hpp @@ -7,19 +7,17 @@ #ifndef SIMGRID_KERNEL_FUTURE_HPP #define SIMGRID_KERNEL_FUTURE_HPP +#include #include +#include +#include #include #include #include #include - -#include -#include -#include -#include -#include +#include namespace simgrid { namespace kernel { @@ -39,9 +37,9 @@ enum class FutureStatus { }; template -struct is_future : public std::integral_constant {}; +struct is_future : std::false_type {}; template -struct is_future> : public std::integral_constant {}; +struct is_future> : std::true_type {}; /** Bases stuff for all @ref simgrid::kernel::FutureState */ class FutureStateBase { @@ -50,6 +48,8 @@ public: FutureStateBase(FutureStateBase const&) = delete; FutureStateBase& operator=(FutureStateBase const&) = delete; + XBT_PUBLIC(void) schedule(simgrid::xbt::Task&& job); + void set_exception(std::exception_ptr exception) { xbt_assert(exception_ == nullptr); @@ -59,9 +59,9 @@ public: this->set_ready(); } - void set_continuation(simgrid::xbt::Task continuation) + void set_continuation(simgrid::xbt::Task&& continuation) { - xbt_assert(!continuation_); + xbt_assert(not continuation_); switch (status_) { case FutureStatus::done: // This is not supposed to happen if continuation is set @@ -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)); } } @@ -121,6 +121,7 @@ protected: status_ = FutureStatus::done; if (exception_) { std::exception_ptr exception = std::move(exception_); + exception_ = nullptr; std::rethrow_exception(std::move(exception)); } } @@ -208,7 +209,7 @@ void bindPromise(Promise promise, Future future) { struct PromiseBinder { public: - PromiseBinder(Promise promise) : promise_(std::move(promise)) {} + explicit PromiseBinder(Promise promise) : promise_(std::move(promise)) {} void operator()(Future future) { simgrid::xbt::setPromise(promise_, future); @@ -281,7 +282,7 @@ template class Future { public: Future() = default; - Future(std::shared_ptr> state): state_(std::move(state)) {} + explicit Future(std::shared_ptr> state) : state_(std::move(state)) {} // Move type: Future(Future&) = delete; @@ -368,12 +369,9 @@ public: * the future is ready * @exception std::future_error no state is associated with the future */ - template - auto then(F continuation) - -> typename std::enable_if< - !is_future::value, - Future - >::type + template + auto then(F continuation) -> typename std::enable_if::value, + Future>::type { return this->thenNoUnwrap(std::move(continuation)); } @@ -390,8 +388,6 @@ public: } /** Get the value from the future - * - * This is expected to be called * * The future must be valid and ready in order to make this call. * @ref std::future blocks when the future is not ready but we are @@ -423,7 +419,7 @@ Future unwrapFuture(Future> future) return std::move(result); } -/** Producer side of a @simgrid::kernel::Future +/** Producer side of a @ref simgrid::kernel::Future * * A @ref Promise is connected to some `Future` and can be used to * set its result. @@ -458,8 +454,8 @@ Future unwrapFuture(Future> future) template class Promise { public: - Promise() : state_(std::make_shared>()) {} - Promise(std::shared_ptr> state) : state_(std::move(state)) {} + explicit Promise() : state_(std::make_shared>()) {} + explicit Promise(std::shared_ptr> state) : state_(std::move(state)) {} // Move type Promise(Promise const&) = delete;