- simgrid::xbt::Result<R> result;
- simcall_run_blocking([&result, &code] { simgrid::xbt::fulfill_promise(result, std::forward<F>(code)); }, t);
- return result.get();
+ simgrid::xbt::Result<void> result;
+ simcall_run_blocking([&result, &code] { simgrid::xbt::fulfill_promise(result, std::forward<F>(code)); }, observer);
+ result.get(); // rethrow stored exception if any
+}
+
+template <class F, class Observer>
+auto simcall_blocking(F&& code, Observer* observer) -> decltype(observer->get_result())
+{
+ simcall_blocking(std::forward<F>(code), static_cast<SimcallObserver*>(observer));
+ return observer->get_result();