mp-coro main
Coroutine support tools
sync_await.h
Go to the documentation of this file.
1// The MIT License (MIT)
2//
3// Copyright (c) 2021 Mateusz Pusz
4//
5// Permission is hereby granted, free of charge, to any person obtaining a copy
6// of this software and associated documentation files (the "Software"), to deal
7// in the Software without restriction, including without limitation the rights
8// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9// copies of the Software, and to permit persons to whom the Software is
10// furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included in all
13// copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21// SOFTWARE.
22
23#pragma once
24
26#include <mp-coro/concepts.h>
27#include <mp-coro/trace.h>
28#include <semaphore>
29
30namespace mp_coro {
31
32/// Creates a [synchronized task](@ref detail::make_synchronized_task) from the
33/// awaitable, starts it, and waits for it to complete, returning the result.
34/// Uses a `std::binary_semaphore` for waiting and synchronization.
35template <awaitable A>
36[[nodiscard]] decltype(auto) sync_await(A &&awaitable) {
37 struct sync {
38 std::binary_semaphore sem {0};
39 void notify_awaitable_completed() { sem.release(); }
40 };
41
42 TRACE_FUNC();
43 auto sync_task = detail::make_synchronized_task<sync>(std::forward<A>(awaitable));
44 sync work_done;
45 sync_task.start(work_done);
46 work_done.sem.acquire();
47 return sync_task.get();
48}
49
50} // namespace mp_coro
Definition: async.h:31
decltype(auto) sync_await(A &&awaitable)
Creates a synchronized task from the awaitable, starts it, and waits for it to complete,...
Definition: sync_await.h:36
#define TRACE_FUNC()
Definition: trace.h:27