Zth (libzth)
zth::impl::ContextBase< Impl > Class Template Reference

Base class of the Context. More...

#include <context.h>

Inheritance diagram for zth::impl::ContextBase< Impl >:
zth::impl::ContextArch< Context > zth::impl::ContextArch< Context > zth::impl::ContextArch< Impl > zth::impl::ContextArch< Impl > zth::Context zth::Context zth::Context zth::Context zth::Context zth::Context zth::Context zth::Context

Classes

struct  Stack
 Stack information. More...
 

Public Member Functions

ContextAttrattr () noexcept
 Return the context attributes, requested by the user. More...
 
ContextAttr const & attr () const noexcept
 Return the context attributes, requested by the user. More...
 
int create () noexcept
 Create context. More...
 
void destroy () noexcept
 Destroy and cleanup context. More...
 
int initStack (Stack &stack, Stack &usable) noexcept
 Allocate and initialize stack. More...
 
void deinitStack (Stack &stack) noexcept
 Deinit and free stack. More...
 
Stack const & stack () const noexcept
 Return the stack address. More...
 
Stack const & stackUsable () const noexcept
 Return the start of the actual usable stack. More...
 
size_t calcStackSize (size_t size) noexcept
 Compute the stack size, given the requested user size and current configuration. More...
 
void * allocStack (size_t size) noexcept
 Allocate requested size of stack memory. More...
 
void deallocStack (Stack &stack) noexcept
 Frees the previously allocated stack. More...
 
void stackAlign (Stack &stack) noexcept
 Compute and modify the stack alignment and size, within the allocated space. More...
 
void valgrindRegister () noexcept
 Register the current stack to valgrind. More...
 
void valgrindDeregister () noexcept
 Deregister the current stack from valgrind. More...
 
int stackGuardInit () noexcept
 Initialize guards around the stack memory. More...
 
void stackGuardDeinit () noexcept
 Release the guards around the memory. More...
 
void stackGuard () noexcept
 Configure the guard for the current fiber. More...
 
void stackGuard (Stack const &stack) noexcept
 Configure the guard for the given stack. More...
 
void * stackGuard (void *p) noexcept
 Configure the guard for the address. More...
 
void context_switch (Context &to) noexcept
 Perform a context switch. More...
 
void context_push_regs () noexcept
 Pre-sjlj context saving. More...
 
void context_pop_regs () noexcept
 Post-sjlj context restoring. More...
 
void context_prepare_jmp (Impl &to, jmp_buf &env) noexcept
 Pre-sjlj jump. More...
 
void die () noexcept
 Flag fiber as died after it returned from context_entry(). More...
 
bool alive () const noexcept
 Check if fiber is still running. More...
 
void * stack_switch (void *stack, size_t size, void *(*f)(void *) noexcept, void *arg) noexcept
 

Static Public Member Functions

static int init () noexcept
 One-time system initialization. More...
 
static void deinit () noexcept
 Final system cleanup. More...
 
static size_t pageSize () noexcept
 Get system's page size. More...
 
static bool stackGrowsDown (void const *reference)
 Checks if the stack grows down or up. More...
 
static void ** sp (Stack const &stack) noexcept
 Get the initial stack pointer for the given stack. More...
 
static void stack_push (void **&sp, void *p) noexcept
 Push data into the stack. More...
 
static void set_sp (jmp_buf &env, void **sp) noexcept
 Set the stack pointer in a jmp_buf. More...
 
static void set_pc (jmp_buf &env, void *sp) noexcept
 Set the program counter in a jmp_buf. More...
 
static void context_trampoline_from_jmp_buf ()
 Entry point to jump to from a (sig)jmp_buf. More...
 

Protected Member Functions

constexpr ContextBase (ContextAttr const &attr) noexcept
 
 ~ContextBase ()
 Dtor. More...
 
Impl & impl () noexcept
 Return Impl this. More...
 
Impl const & impl () const noexcept
 Return Impl this. More...
 

Detailed Description

template<typename Impl>
class zth::impl::ContextBase< Impl >

Base class of the Context.

The Context consists of three layers:

Although the classes inherit each other and override methods, they are not virtual. All implementation is done in the header. The lowest subclass is passed as template parameter to the parents, which allows invoking the most specific methods. This allows fully inlining and optimizing the functions.

Definition at line 71 of file context.h.

Constructor & Destructor Documentation

◆ ContextBase()

template<typename Impl >
constexpr zth::impl::ContextBase< Impl >::ContextBase ( ContextAttr const &  attr)
inlineexplicitconstexprprotectednoexcept

Definition at line 74 of file context.h.

◆ ~ContextBase()

template<typename Impl >
zth::impl::ContextBase< Impl >::~ContextBase ( )
inlineprotected

Dtor.

Definition at line 84 of file context.h.

Member Function Documentation

◆ alive()

template<typename Impl >
bool zth::impl::ContextBase< Impl >::alive ( ) const
inlinenoexcept

Check if fiber is still running.

Definition at line 521 of file context.h.

◆ allocStack()

template<typename Impl >
void* zth::impl::ContextBase< Impl >::allocStack ( size_t  size)
inlinenoexcept

Allocate requested size of stack memory.

Alignment does not have to be enforced.

Parameters
sizethe requested size, which is a multiple of pageSize().

Definition at line 290 of file context.h.

◆ attr() [1/2]

template<typename Impl >
ContextAttr const& zth::impl::ContextBase< Impl >::attr ( ) const
inlinenoexcept

Return the context attributes, requested by the user.

Definition at line 154 of file context.h.

◆ attr() [2/2]

template<typename Impl >
ContextAttr& zth::impl::ContextBase< Impl >::attr ( )
inlinenoexcept

Return the context attributes, requested by the user.

Definition at line 146 of file context.h.

◆ calcStackSize()

template<typename Impl >
size_t zth::impl::ContextBase< Impl >::calcStackSize ( size_t  size)
inlinenoexcept

Compute the stack size, given the requested user size and current configuration.

Definition at line 268 of file context.h.

◆ context_pop_regs()

template<typename Impl >
void zth::impl::ContextBase< Impl >::context_pop_regs ( )
inlinenoexcept

Post-sjlj context restoring.

Definition at line 501 of file context.h.

◆ context_prepare_jmp()

template<typename Impl >
void zth::impl::ContextBase< Impl >::context_prepare_jmp ( Impl &  to,
jmp_buf &  env 
)
inlinenoexcept

Pre-sjlj jump.

Definition at line 506 of file context.h.

◆ context_push_regs()

template<typename Impl >
void zth::impl::ContextBase< Impl >::context_push_regs ( )
inlinenoexcept

Pre-sjlj context saving.

Definition at line 496 of file context.h.

◆ context_switch()

template<typename Impl >
void zth::impl::ContextBase< Impl >::context_switch ( Context to)
noexcept

Perform a context switch.

◆ context_trampoline_from_jmp_buf()

template<typename Impl >
static void zth::impl::ContextBase< Impl >::context_trampoline_from_jmp_buf ( )
static

Entry point to jump to from a (sig)jmp_buf.

As the pc is probably set via set_pc(), which is not really supported by the standard libary, you may also have to implement this function a bit more careful.

It should call context_entry in the end.

◆ create()

template<typename Impl >
int zth::impl::ContextBase< Impl >::create ( )
inlinenoexcept

Create context.

Definition at line 162 of file context.h.

◆ deallocStack()

template<typename Impl >
void zth::impl::ContextBase< Impl >::deallocStack ( Stack stack)
inlinenoexcept

Frees the previously allocated stack.

Definition at line 315 of file context.h.

◆ deinit()

template<typename Impl >
static void zth::impl::ContextBase< Impl >::deinit ( )
inlinestaticnoexcept

Final system cleanup.

Definition at line 141 of file context.h.

◆ deinitStack()

template<typename Impl >
void zth::impl::ContextBase< Impl >::deinitStack ( Stack stack)
inlinenoexcept

Deinit and free stack.

Definition at line 230 of file context.h.

◆ destroy()

template<typename Impl >
void zth::impl::ContextBase< Impl >::destroy ( )
inlinenoexcept

Destroy and cleanup context.

Definition at line 192 of file context.h.

◆ die()

template<typename Impl >
void zth::impl::ContextBase< Impl >::die ( )
inlinenoexcept

Flag fiber as died after it returned from context_entry().

Definition at line 511 of file context.h.

◆ impl() [1/2]

template<typename Impl >
Impl const& zth::impl::ContextBase< Impl >::impl ( ) const
inlineprotectednoexcept

Return Impl this.

Definition at line 101 of file context.h.

◆ impl() [2/2]

template<typename Impl >
Impl& zth::impl::ContextBase< Impl >::impl ( )
inlineprotectednoexcept

Return Impl this.

Definition at line 93 of file context.h.

◆ init()

template<typename Impl >
static int zth::impl::ContextBase< Impl >::init ( )
inlinestaticnoexcept

One-time system initialization.

Definition at line 133 of file context.h.

◆ initStack()

template<typename Impl >
int zth::impl::ContextBase< Impl >::initStack ( Stack stack,
Stack usable 
)
inlinenoexcept

Allocate and initialize stack.

Definition at line 203 of file context.h.

◆ pageSize()

template<typename Impl >
static size_t zth::impl::ContextBase< Impl >::pageSize ( )
inlinestaticnoexcept

Get system's page size.

Definition at line 238 of file context.h.

◆ set_pc()

template<typename Impl >
static void zth::impl::ContextBase< Impl >::set_pc ( jmp_buf &  env,
void *  sp 
)
staticnoexcept

Set the program counter in a jmp_buf.

◆ set_sp()

template<typename Impl >
static void zth::impl::ContextBase< Impl >::set_sp ( jmp_buf &  env,
void **  sp 
)
staticnoexcept

Set the stack pointer in a jmp_buf.

◆ sp()

template<typename Impl >
static void** zth::impl::ContextBase< Impl >::sp ( Stack const &  stack)
staticnoexcept

Get the initial stack pointer for the given stack.

◆ stack()

template<typename Impl >
Stack const& zth::impl::ContextBase< Impl >::stack ( ) const
inlinenoexcept

Return the stack address.

Definition at line 252 of file context.h.

◆ stack_push()

template<typename Impl >
static void zth::impl::ContextBase< Impl >::stack_push ( void **&  sp,
void *  p 
)
staticnoexcept

Push data into the stack.

◆ stack_switch()

template<typename Impl >
void* zth::impl::ContextBase< Impl >::stack_switch ( void *  stack,
size_t  size,
void *(*)(void *) noexcept  f,
void *  arg 
)
inlinenoexcept

Definition at line 530 of file context.h.

◆ stackAlign()

template<typename Impl >
void zth::impl::ContextBase< Impl >::stackAlign ( Stack stack)
inlinenoexcept

Compute and modify the stack alignment and size, within the allocated space.

Definition at line 332 of file context.h.

◆ stackGrowsDown()

template<typename Impl >
static bool zth::impl::ContextBase< Impl >::stackGrowsDown ( void const *  reference)
inlinestatic

Checks if the stack grows down or up.

Parameters
referencea pointer to some object that is at the caller's stack
Returns
true if it grows down

Definition at line 427 of file context.h.

◆ stackGuard() [1/3]

template<typename Impl >
void zth::impl::ContextBase< Impl >::stackGuard ( )
inlinenoexcept

Configure the guard for the current fiber.

This is called after every context switch.

Definition at line 438 of file context.h.

◆ stackGuard() [2/3]

template<typename Impl >
void zth::impl::ContextBase< Impl >::stackGuard ( Stack const &  stack)
inlinenoexcept

Configure the guard for the given stack.

Definition at line 446 of file context.h.

◆ stackGuard() [3/3]

template<typename Impl >
void* zth::impl::ContextBase< Impl >::stackGuard ( void *  p)
inlinenoexcept

Configure the guard for the address.

Returns
the previous guard

Definition at line 452 of file context.h.

◆ stackGuardDeinit()

template<typename Impl >
void zth::impl::ContextBase< Impl >::stackGuardDeinit ( )
inlinenoexcept

Release the guards around the memory.

Definition at line 417 of file context.h.

◆ stackGuardInit()

template<typename Impl >
int zth::impl::ContextBase< Impl >::stackGuardInit ( )
inlinenoexcept

Initialize guards around the stack memory.

Definition at line 396 of file context.h.

◆ stackUsable()

template<typename Impl >
Stack const& zth::impl::ContextBase< Impl >::stackUsable ( ) const
inlinenoexcept

Return the start of the actual usable stack.

Definition at line 260 of file context.h.

◆ valgrindDeregister()

template<typename Impl >
void zth::impl::ContextBase< Impl >::valgrindDeregister ( )
inlinenoexcept

Deregister the current stack from valgrind.

Definition at line 385 of file context.h.

◆ valgrindRegister()

template<typename Impl >
void zth::impl::ContextBase< Impl >::valgrindRegister ( )
inlinenoexcept

Register the current stack to valgrind.

Definition at line 367 of file context.h.


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