X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f6ea9d672be1e8c695c1757126f00ece5b5cf790..3388e09cbb920fc3b904327f3b254f794e231ed1:/include/simgrid/kernel/future.hpp diff --git a/include/simgrid/kernel/future.hpp b/include/simgrid/kernel/future.hpp index 9a57f8b6a1..6adfe664dd 100644 --- a/include/simgrid/kernel/future.hpp +++ b/include/simgrid/kernel/future.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2016. The SimGrid Team. +/* Copyright (c) 2016-2018. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -48,7 +48,7 @@ public: FutureStateBase(FutureStateBase const&) = delete; FutureStateBase& operator=(FutureStateBase const&) = delete; - XBT_PUBLIC(void) schedule(simgrid::xbt::Task&& job); + XBT_PUBLIC void schedule(simgrid::xbt::Task&& job); void set_exception(std::exception_ptr exception) { @@ -61,7 +61,7 @@ public: 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 @@ -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)); } } @@ -136,7 +137,7 @@ private: * You are not expected to use them directly but to create them * implicitely through a @ref simgrid::kernel::Promise. * Alternatively kernel operations could inherit or contain FutureState - * if they are managed with @ref std::shared_ptr. + * if they are managed with std::shared_ptr. **/ template class FutureState : public FutureStateBase { @@ -180,7 +181,7 @@ public: xbt_assert(this->value_); T* result = value_; value_ = nullptr; - return *value_; + return *result; } private: @@ -206,9 +207,9 @@ public: template void bindPromise(Promise promise, Future future) { - struct PromiseBinder { + class 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); @@ -260,7 +261,7 @@ template Future unwrapFuture(Future> future); * ); * * - * This is based on C++1z @ref std::future but with some differences: + * This is based on C++1z std::future but with some differences: * * * there is no thread synchronization (atomic, mutex, condition variable, * etc.) because everything happens in the SimGrid event loop; @@ -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; @@ -326,8 +327,7 @@ public: throw std::future_error(std::future_errc::no_state); // Give shared-ownership to the continuation: auto state = std::move(state_); - state->set_continuation(simgrid::xbt::makeTask( - std::move(continuation), state)); + state->set_continuation(simgrid::xbt::make_task(std::move(continuation), state)); } /** Attach a continuation to this future @@ -346,15 +346,13 @@ public: Promise promise; Future future = promise.get_future(); // ...and when the current future is ready... - state->set_continuation(simgrid::xbt::makeTask( - [](Promise promise, std::shared_ptr> state, F continuation) { - // ...set the new future value by running the continuation. - Future future(std::move(state)); - simgrid::xbt::fulfillPromise(promise,[&]{ - return continuation(std::move(future)); - }); - }, - std::move(promise), state, std::move(continuation))); + state->set_continuation(simgrid::xbt::make_task( + [](Promise promise, std::shared_ptr> state, F continuation) { + // ...set the new future value by running the continuation. + Future future(std::move(state)); + simgrid::xbt::fulfillPromise(promise, [&] { return continuation(std::move(future)); }); + }, + std::move(promise), state, std::move(continuation))); return std::move(future); } @@ -368,12 +366,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)); } @@ -392,7 +387,7 @@ public: /** Get the value from the future * * 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 + * std::future blocks when the future is not ready but we are * completely single-threaded so blocking would be a deadlock. * After the call, the future becomes invalid. * @@ -421,12 +416,12 @@ 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. * - * Similar to @ref std::promise + * Similar to std::promise * * * // Create a promise and a future: @@ -457,7 +452,7 @@ template class Promise { public: Promise() : state_(std::make_shared>()) {} - Promise(std::shared_ptr> state) : state_(std::move(state)) {} + explicit Promise(std::shared_ptr> state) : state_(std::move(state)) {} // Move type Promise(Promise const&) = delete; @@ -512,7 +507,7 @@ template<> class Promise { public: Promise() : state_(std::make_shared>()) {} - Promise(std::shared_ptr> state) : state_(std::move(state)) {} + explicit Promise(std::shared_ptr> state) : state_(std::move(state)) {} ~Promise() { if (state_ && state_->get_status() == FutureStatus::not_ready)