X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cdf6a962eb4e88efbed3df9c41343adabcf09e6c..ab98ac80806c788b35c414a429f80345663e38a5:/include/simgrid/simix/blocking_simcall.hpp diff --git a/include/simgrid/simix/blocking_simcall.hpp b/include/simgrid/simix/blocking_simcall.hpp index 017b7f2248..110a27d363 100644 --- a/include/simgrid/simix/blocking_simcall.hpp +++ b/include/simgrid/simix/blocking_simcall.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2016-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2016-2021. 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. */ @@ -13,10 +13,10 @@ #include -#include #include #include #include +#include namespace simgrid { namespace simix { @@ -45,7 +45,7 @@ XBT_PUBLIC void unblock(smx_actor_t process); */ template auto kernel_sync(F code) -> decltype(code().get()) { - typedef decltype(code().get()) T; + using T = decltype(code().get()); if (SIMIX_is_maestro()) xbt_die("Can't execute blocking call in kernel mode"); @@ -56,8 +56,8 @@ template auto kernel_sync(F code) -> decltype(code().get()) [&result, self, &code] { try { auto future = code(); - future.then_([&result, self](std::shared_ptr>&& value) { - simgrid::xbt::set_promise(result, simgrid::kernel::Future(value)); + future.then_([&result, self](std::shared_ptr> value) { + simgrid::xbt::set_promise(result, simgrid::kernel::Future(std::move(value))); simgrid::simix::unblock(self); }); } catch (...) { @@ -70,16 +70,19 @@ template auto kernel_sync(F code) -> decltype(code().get()) } /** A blocking (`wait()`-based) future for SIMIX processes */ -// TODO, .wait_for -// TODO, .wait_until -// TODO, SharedFuture -// TODO, simgrid::simix::when_all - wait for all future to be ready (this one is simple!) -// TODO, simgrid::simix::when_any - wait for any future to be ready +// TODO: +// - .wait_for +// - .wait_until +// - SharedFuture +// - simgrid::simix::when_all - wait for all future to be ready (this one is simple!) +// - simgrid::simix::when_any - wait for any future to be ready template class Future { public: - Future() { /* Nothing to do*/} + Future() = default; explicit Future(simgrid::kernel::Future future) : future_(std::move(future)) {} + Future(Future&&) noexcept = default; + Future& operator=(Future&&) noexcept = default; bool valid() const { return future_.valid(); } T get() @@ -92,9 +95,9 @@ public: [this, &result, self] { try { // When the kernel future is ready... - this->future_.then_([&result, self](std::shared_ptr>&& value) { + this->future_.then_([&result, self](std::shared_ptr> value) { // ... wake up the process with the result of the kernel future. - simgrid::xbt::set_promise(result, simgrid::kernel::Future(value)); + simgrid::xbt::set_promise(result, simgrid::kernel::Future(std::move(value))); simgrid::simix::unblock(self); }); } catch (...) { @@ -123,9 +126,9 @@ public: [this, &exception, self] { try { // When the kernel future is ready... - this->future_.then_([this, self](std::shared_ptr>&& value) { + this->future_.then_([this, self](std::shared_ptr> value) { // ...store it the simix kernel and wake up. - this->future_ = std::move(simgrid::kernel::Future(value)); + this->future_ = simgrid::kernel::Future(std::move(value)); simgrid::simix::unblock(self); }); } catch (...) { @@ -135,6 +138,7 @@ public: }, nullptr); } + private: // We wrap an event-based kernel future: simgrid::kernel::Future future_; @@ -147,12 +151,12 @@ private: */ template auto kernel_async(F code) -> Future { - typedef decltype(code().get()) T; + using T = decltype(code().get()); // Execute the code in the kernel and get the kernel future: simgrid::kernel::Future future = simgrid::kernel::actor::simcall(std::move(code)); - // Wrap the kernel future in a actor future: + // Wrap the kernel future in an actor future: return simgrid::simix::Future(std::move(future)); } }