Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[simix] Fix simgrid::simix::kernel for void return
authorGabriel Corona <gabriel.corona@loria.fr>
Mon, 4 Jan 2016 12:02:30 +0000 (13:02 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Mon, 4 Jan 2016 12:02:30 +0000 (13:02 +0100)
include/simgrid/simix.hpp

index 5fbc4d5..0cdf6ea 100644 (file)
@@ -24,18 +24,38 @@ XBT_PUBLIC(void) simcall_run_kernel(std::function<void()> const& code);
 namespace simgrid {
 namespace simix {
 
 namespace simgrid {
 namespace simix {
 
+template<class R, class F>
+void fulfill_promise(std::promise<R>& promise, F&& code)
+{
+  try {
+    promise.set_value(code());
+  }
+  catch(...) {
+    promise.set_exception(std::current_exception());
+  }
+}
+
+// special version for R=void because the previous code does not compile
+// in this case:
+template<class F>
+void fulfill_promise(std::promise<void>& promise, F&& code)
+{
+  try {
+    code();
+    promise.set_value();
+  }
+  catch(...) {
+    promise.set_exception(std::current_exception());
+  }
+}
+
 template<class F>
 typename std::result_of<F()>::type kernel(F&& code)
 {
   typedef typename std::result_of<F()>::type R;
   std::promise<R> promise;
   simcall_run_kernel([&]{
 template<class F>
 typename std::result_of<F()>::type kernel(F&& code)
 {
   typedef typename std::result_of<F()>::type R;
   std::promise<R> promise;
   simcall_run_kernel([&]{
-    try {
-      promise.set_value(code());
-    }
-    catch(...) {
-      promise.set_exception(std::current_exception());
-    }
+    fulfill_promise(promise, code);
   });
   return promise.get_future().get();
 }
   });
   return promise.get_future().get();
 }