Mercury Currency Engine
|
#include <deque>
#include <memory>
#include "function_utility.hpp"
#include "scheduler.hpp"
#include "threadpool.hpp"
#include "unbuffered_channel.hpp"
Go to the source code of this file.
Classes | |
struct | mce::detail::await_coroutine |
struct | mce::detail::await_worker |
struct | mce::detail::await_worker::worker_task |
struct | mce::detail::await_threadpool |
specialized threadpool implementation for handling blocking tasks More... | |
Functions | |
template<typename Callable , typename... As> | |
detail::function_return_type< Callable, As... > | mce::detail::await_ (std::false_type, Callable &&cb, As &&... args) |
template<typename Callable , typename... As> | |
int | mce::detail::await_ (std::true_type, Callable &&cb, As &&... args) |
template<typename Callable , typename... As> | |
detail::convert_void_return< Callable, As... > | mce::await (Callable &&cb, As &&... args) |
Execute Callable potentially on a different thread and block current context until operation completes. More... | |
bool | mce::is_await () |
size_t | mce::await_count () |
trivial execution of blocking operations (such as in/out operations)
|
inline |
Execute Callable potentially on a different thread and block current context until operation completes.
await() accepts a Callable, and any number of arguments, and returns the result of calling the given Callable with the given arguments. await() is a special function which enables blocking Callable calls made from a coroutine to be executed safely so that it does not block other coroutines from running.
Anything that does an OS level block (non-mce sleeping, std::mutex::lock(), std::condition_variable::wait(), file operations, etc...) can be executed within this call without blocking other scheduler coroutines.
Because the caller of mce::await()
is blocked during this operations runtime, it is safe to access values on the caller's stack by reference.
If mce::await()
is called outside of a coroutine running on a mce::scheduler
OR mce::await()
was called inside another call to mce::await()
, the argument Callable is executed immediately on the current thread instead of on another thread. Otherwise, the calling coroutine will be blocked an the operation passed to mce::await()
will be executed on another, dedicated thread inside another mce::scheduler
.
Calls (or implicit calls) to this_scheduler()
, or this_threadpool()
made within a call to mce::await()
will return the values they would have if they had been called outside of mce::await()
. That is, code running in mce::await()
will be able to schedule operations as if it was running in its original execution environment. IE, calls to mce::concurrent()
or mce::parallel()
will function "normally".
|
inline |
|
inline |