gem5 v24.0.0.0
Loading...
Searching...
No Matches
gem5::Coroutine< Arg, Ret > Class Template Reference

This template defines a Coroutine wrapper type with a Boost-like interface. More...

#include <coroutine.hh>

Inheritance diagram for gem5::Coroutine< Arg, Ret >:
gem5::Fiber

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.
 
virtual ~Coroutine ()
 
template<typename T = Arg>
Coroutineoperator() (typename std::enable_if_t<!std::is_same_v< T, void >, T > param)
 Coroutine interface.
 
template<typename T = Arg>
std::enable_if_t< std::is_same_v< T, void >, Coroutine > & operator() ()
 operator() is the way we can jump inside the coroutine.
 
template<typename T = Ret>
std::enable_if_t<!std::is_same_v< T, void >, T > get ()
 get() is the way we can extrapolate return values (yielded) from the coroutine.
 
 operator bool () const
 Check if coroutine is still running.
 
 Coroutine ()=delete
 
 Coroutine (const Coroutine &rhs)=delete
 
Coroutineoperator= (const Coroutine &rhs)=delete
 
- Public Member Functions inherited from gem5::Fiber
virtual ~Fiber ()
 
void run ()
 Start executing the fiber represented by this object.
 
bool finished () const
 Returns whether the "main" function of this fiber has finished.
 
bool started () const
 Returns whether the "main" function of this fiber has started.
 
 Fiber (size_t stack_size=DefaultStackSize)
 
 Fiber (Fiber *link, size_t stack_size=DefaultStackSize)
 

Private Types

using ArgChannel
 
using RetChannel
 

Private Member Functions

void main () override
 Overriding base (Fiber) main.
 
void call ()
 

Private Attributes

ArgChannel argsChannel
 Arguments for the coroutine.
 
std::function< void(CallerType &)> task
 Coroutine task.
 
CallerType caller
 Coroutine caller.
 

Additional Inherited Members

- Static Public Member Functions inherited from gem5::Fiber
static FibercurrentFiber ()
 Get a pointer to the current running Fiber.
 
static FiberprimaryFiber ()
 Get a pointer to the primary Fiber.
 
- Static Public Attributes inherited from gem5::Fiber
static const size_t DefaultStackSize = 0x50000
 
- Protected Member Functions inherited from gem5::Fiber
void setStarted ()
 

Detailed Description

template<typename Arg, typename Ret>
class gem5::Coroutine< Arg, Ret >

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 63 of file coroutine.hh.

Member Typedef Documentation

◆ ArgChannel

template<typename Arg , typename Ret >
using gem5::Coroutine< Arg, Ret >::ArgChannel
private
Initial value:
typename std::conditional_t<
std::is_same_v<Arg, void>, Empty, std::stack<Arg>>

Definition at line 70 of file coroutine.hh.

◆ RetChannel

template<typename Arg , typename Ret >
using gem5::Coroutine< Arg, Ret >::RetChannel
private
Initial value:
typename std::conditional_t<
std::is_same_v<Ret, void>, Empty, std::stack<Ret>>

Definition at line 73 of file coroutine.hh.

Member Function Documentation

◆ call()

◆ main()

template<typename Arg , typename Ret >
void gem5::Coroutine< Arg, Ret >::main ( )
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 gem5::Fiber.

Definition at line 275 of file coroutine.hh.

References gem5::Coroutine< Arg, Ret >::caller, and gem5::Coroutine< Arg, Ret >::task.

Member Data Documentation

◆ argsChannel

template<typename Arg , typename Ret >
ArgChannel gem5::Coroutine< Arg, Ret >::argsChannel
private

Arguments for the coroutine.

Definition at line 286 of file coroutine.hh.

Referenced by gem5::Coroutine< Arg, Ret >::CallerType::get(), and gem5::Coroutine< Arg, Ret >::operator()().

◆ caller

template<typename Arg , typename Ret >
CallerType gem5::Coroutine< Arg, Ret >::caller
private

◆ task

template<typename Arg , typename Ret >
std::function<void(CallerType&)> gem5::Coroutine< Arg, Ret >::task
private

Coroutine task.

Definition at line 289 of file coroutine.hh.

Referenced by gem5::Coroutine< Arg, Ret >::main().


The documentation for this class was generated from the following file:

Generated on Tue Jun 18 2024 16:24:10 for gem5 by doxygen 1.11.0