gem5
v20.1.0.0
|
This template defines a Coroutine wrapper type with a Boost-like interface. More...
#include <coroutine.hh>
Classes | |
class | CallerType |
CallerType: A reference to an object of this class will be passed to the coroutine task. More... | |
struct | Empty |
Public Member Functions | |
Coroutine (std::function< void(CallerType &)> f, bool run_coroutine=true) | |
Coroutine constructor. More... | |
virtual | ~Coroutine () |
template<typename T = Arg> | |
Coroutine & | operator() (typename std::enable_if< !std::is_same< T, void >::value, T >::type param) |
Coroutine interface. More... | |
template<typename T = Arg> | |
std::enable_if< std::is_same< T, void >::value, Coroutine >::type & | operator() () |
operator() is the way we can jump inside the coroutine. More... | |
template<typename T = Ret> | |
std::enable_if<!std::is_same< T, void >::value, T >::type | get () |
get() is the way we can extrapolate return values (yielded) from the coroutine. More... | |
operator bool () const | |
Check if coroutine is still running. More... | |
Coroutine ()=delete | |
Coroutine (const Coroutine &rhs)=delete | |
Coroutine & | operator= (const Coroutine &rhs)=delete |
Public Member Functions inherited from Fiber | |
virtual | ~Fiber () |
void | run () |
Start executing the fiber represented by this object. More... | |
bool | finished () const |
Returns whether the "main" function of this fiber has finished. More... | |
bool | started () const |
Returns whether the "main" function of this fiber has started. More... | |
Fiber (size_t stack_size=DefaultStackSize) | |
Fiber (Fiber *link, size_t stack_size=DefaultStackSize) | |
Private Types | |
using | ArgChannel = typename std::conditional< std::is_same< Arg, void >::value, Empty, std::stack< Arg > >::type |
using | RetChannel = typename std::conditional< std::is_same< Ret, void >::value, Empty, std::stack< Ret > >::type |
Private Member Functions | |
void | main () override |
Overriding base (Fiber) main. More... | |
void | call () |
Private Attributes | |
ArgChannel | argsChannel |
Arguments for the coroutine. More... | |
std::function< void(CallerType &)> | task |
Coroutine task. More... | |
CallerType | caller |
Coroutine caller. More... | |
Additional Inherited Members | |
Static Public Member Functions inherited from Fiber | |
static Fiber * | currentFiber () |
Get a pointer to the current running Fiber. More... | |
static Fiber * | primaryFiber () |
Get a pointer to the primary Fiber. More... | |
Static Public Attributes inherited from Fiber | |
const static size_t | DefaultStackSize = 0x50000 |
Protected Member Functions inherited from Fiber | |
void | setStarted () |
This template defines a Coroutine wrapper type with a Boost-like interface.
It is built on top of the gem5 fiber class. The two template parameters (Arg and Ret) are the coroutine argument and coroutine return types which are passed between the coroutine and the caller via operator() and get() method. This implementation doesn't support passing multiple values, so a tuple must be used in that scenario.
Most methods are templatized since it is relevant to distinguish the cases where one or both of the template parameters are void
Definition at line 62 of file coroutine.hh.
|
private |
Definition at line 70 of file coroutine.hh.
|
private |
Definition at line 73 of file coroutine.hh.
|
inlineprivate |
Definition at line 278 of file coroutine.hh.
References m5::Coroutine< Arg, Ret >::caller, m5::Coroutine< Arg, Ret >::CallerType::callerFiber, Fiber::currentFiber(), and Fiber::run().
Referenced by m5::Coroutine< Arg, Ret >::Coroutine(), m5::Coroutine< Arg, Ret >::get(), and m5::Coroutine< Arg, Ret >::operator()().
|
inlineoverrideprivatevirtual |
Overriding base (Fiber) main.
This method will be automatically called by the Fiber running engine and it is a simple wrapper for the task that the coroutine is supposed to run.
Implements Fiber.
Definition at line 275 of file coroutine.hh.
References m5::Coroutine< Arg, Ret >::caller, and m5::Coroutine< Arg, Ret >::task.
|
private |
Arguments for the coroutine.
Definition at line 286 of file coroutine.hh.
Referenced by m5::Coroutine< Arg, Ret >::CallerType::get(), and m5::Coroutine< Arg, Ret >::operator()().
|
private |
Coroutine caller.
Definition at line 292 of file coroutine.hh.
Referenced by m5::Coroutine< Arg, Ret >::call(), m5::Coroutine< Arg, Ret >::get(), and m5::Coroutine< Arg, Ret >::main().
|
private |
Coroutine task.
Definition at line 289 of file coroutine.hh.
Referenced by m5::Coroutine< Arg, Ret >::main().