-/* Copyright (c) 2016. The SimGrid Team.
+/* Copyright (c) 2016-2017. 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 <future>
-#include <list>
+#include <memory>
+#include <stdexcept>
#include <xbt/future.hpp>
namespace example {
-/** Execute the code in the kernel at some time
- *
- * @param date when we should execute the code
- * @param code code to execute
- * @return future with the result of the call
- */
-template<class F>
-auto kernel_defer(double date, F code) -> simgrid::kernel::Future<decltype(code())>
+/** Create a future which becomes ready when the date is reached */
+static
+simgrid::kernel::Future<void> kernel_wait_until(double date)
{
- typedef decltype(code()) T;
- auto promise = std::make_shared<simgrid::kernel::Promise<T>>();
+ auto promise = std::make_shared<simgrid::kernel::Promise<void>>();
auto future = promise->get_future();
- SIMIX_timer_set(date, [promise, code] {
- simgrid::xbt::fulfillPromise(*promise, std::move(code));
+ SIMIX_timer_set(date, [promise] {
+ promise->set_value();
});
return future;
}
XBT_INFO("kernel, returned");
// Synchronize on a successful Future<void>:
- simgrid::simix::kernelSync([&] {
- return kernel_defer(10, [] {
+ simgrid::simix::kernelSync([] {
+ return kernel_wait_until(10).then([](simgrid::kernel::Future<void> future) {
+ future.get();
XBT_INFO("kernelSync with void");
});
});
// Synchronize on a failing Future<void>:
try {
- simgrid::simix::kernelSync([&] {
- return kernel_defer(20, [] {
+ simgrid::simix::kernelSync([] {
+ return kernel_wait_until(20).then([](simgrid::kernel::Future<void> future) {
+ future.get();
throw std::runtime_error("Exception throwed from kernel_defer");
});
});
}
// Synchronize on a successul Future<int> and get the value:
- int res = simgrid::simix::kernelSync([&] {
- return kernel_defer(30, [] {
+ int res = simgrid::simix::kernelSync([] {
+ return kernel_wait_until(30).then([](simgrid::kernel::Future<void> future) {
+ future.get();
XBT_INFO("kernelSync with value");
return 42;
});
XBT_INFO("kernelSync with value returned with %i", res);
// Synchronize on a successul Future<int> and get the value:
- simgrid::simix::Future<int> future = simgrid::simix::kernelAsync([&] {
- return kernel_defer(50, [] {
+ simgrid::simix::Future<int> future = simgrid::simix::kernelAsync([] {
+ return kernel_wait_until(50).then([](simgrid::kernel::Future<void> future) {
+ future.get();
XBT_INFO("kernelAsync with value");
return 43;
});
res = future.get();
XBT_INFO("kernelAsync with value returned with %i", res);
+ // Synchronize on a successul Future<int> and get the value:
+ future = simgrid::simix::kernelAsync([] {
+ return kernel_wait_until(60).then([](simgrid::kernel::Future<void> future) {
+ future.get();
+ XBT_INFO("kernelAsync with value");
+ return 43;
+ });
+ });
+ XBT_INFO("The future is %s", future.is_ready() ? "ready" : "not ready");
+ future.wait();
+ XBT_INFO("The future is %s", future.is_ready() ? "ready" : "not ready");
+ res = future.get();
+ XBT_INFO("kernelAsync with value returned with %i", res);
+
return 0;
}
xbt_assert(argc == 2, "Usage: %s platform.xml\n", argv[0]);
SIMIX_function_register("master", example::master);
SIMIX_create_environment(argv[1]);
- simcall_process_create("master", example::master, NULL, "Tremblay", -1, 0, NULL, NULL, 0);
+ simcall_process_create("master", example::master, NULL, sg_host_by_name("Tremblay"), 0, NULL, NULL);
SIMIX_run();
return 0;
}