2
0
mirror of https://github.com/boostorg/context.git synced 2026-01-19 04:02:17 +00:00

documentation updated

This commit is contained in:
Oliver Kowalke
2016-01-12 20:29:58 +01:00
parent fe73f5ad9e
commit 1bf9f6dfdb
30 changed files with 5243 additions and 1082 deletions

410
doc/captured_context.qbk Normal file
View File

@@ -0,0 +1,410 @@
[/
Copyright Oliver Kowalke 2014.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[#ccontext]
[section:ccontext Class captured_context]
Class __ccontext__ encapsulates __fcontext__ and manages the context' stack
(allocation/deallocation).
__ccontext__ allocates the context stack (using its __stack_allocator__
argument) and creates a control structure on top of it. This structure
controls the life time of the stack. The address of the control structure is
stored in the first frame of context' stack (e.g. it can not accessed by
instances of __ccontext__ directly). In contrast to __econtext__ the ownership
of the control structure is not shared
A call of__cc_op__ enters the context represented by `*this` and invalidates
`*this`. The context that has been suspended by calling __cc_op__ is passed to
the resumed context, e.g. as argument of the context-function if the context was
resumed the first time or returned by __cc_op__.
__ccontext__ is only move-constructible and move-assignable.
If the last reference (__ccontext__) goes out of scope, the control structure
is destroyed and the stack gets deallocated via the __stack_allocator__.
__ccontext__ maintains a static, thread-local pointer (smart pointer),
accessed by __ec_current__, pointing to the active context.
On each context switch the static, thread-local pointer is updated. This makes
the context switch a little bit slower, but enables faster context destruction
(stack unwinding) compared to __ccontext__.
__ccontext__ expects a function/functor with signature
`captured_context( captured_context ctx, void * vp)`. The parameter `ctx`
represents the context from which this context was resumed (e.g. that has called
__cc_op__ on `*this`) and `vp` is the data passed to __cc_op__. The
function/functor has to return the captured_context that has to be resumed,
while this context terminates.
[important Segemnted stacks are not supported together with __ccontext__.]
[heading usage of __ccontext__]
/*
* grammar:
* P ---> E '\0'
* E ---> T {('+'|'-') T}
* T ---> S {('*'|'/') S}
* S ---> digit | '(' E ')'
*/
class Parser{
// implementation omitted; see examples directory
};
std::istringstream is("1+1");
bool done=false;
std::exception_ptr except;
// execute parser in new execution context
boost::context::captured_context pctx(
[&is,&done,&except](ctx::captured_context mctx,void* ignored){
// create parser with callback function
Parser p( is,
[&mctx](char ch){
// resume main execution context
auto result = mctx( & ch);
mctx = std::move( std::get<0>( result) );
});
try {
// start recursive parsing
p.run();
} catch ( ... ) {
// store other exceptions in exception-pointer
except = std::current_exception();
}
// set termination flag
done=true;
// resume main execution context
return mctx;
});
// user-code pulls parsed data from parser
// invert control flow
auto result = pctx();
pctx = std::move( std::get<0>( result) );
void * vp = std::get<1>( result);
if ( except) {
std::rethrow_exception( except);
}
while( ! done) {
printf("Parsed: %c\n",* static_cast< char* >( vp) );
std::tie(pctx,vp) = pctx();
if ( except) {
std::rethrow_exception( except);
}
}
output:
Parsed: 1
Parsed: +
Parsed: 1
In this example a recursive descent parser uses a callback to emit a newly
passed symbol. Using __ccontext__ the control flow can be inverted, e.g. the
user-code pulls parsed symbols from the parser - instead to get pushed from the
parser (via callback).
The data (character) is transferred between the two __ccontext__.
If the code executed by __ccontext__ emits an exception, the application is
terminated. ['std::exception_ptr] can be used to transfer exceptions between
different execution contexts.
Sometimes it is necessary to unwind the stack of an unfinished context to
destroy local stack variables so they can release allocated resources (RAII
pattern). The user is responsible for this task.
[heading allocating control structures on top of stack]
Allocating control structures on top of the stack requires to allocated the
__stack_context__ and create the control structure with placement new before
__ccontext__ is created.
[note The user is responsible for destructing the control structure at the top
of the stack.]
// stack-allocator used for (de-)allocating stack
fixedsize_stack salloc( 4048);
// allocate stack space
stack_context sctx( salloc.allocate() );
// reserve space for control structure on top of the stack
void * sp = static_cast< char * >( sctx.sp) - sizeof( my_control_structure);
std::size_t size = sctx.size - sizeof( my_control_structure);
// placement new creates control structure on reserved space
my_control_structure * cs = new ( sp) my_control_structure( sp, size, sctx, salloc);
...
// destructing the control structure
cs->~my_control_structure();
...
struct my_control_structure {
// captured context
captured_context cctx;
template< typename StackAllocator >
my_control_structure( void * sp, std::size_t size, stack_context sctx, StackAllocator salloc) :
// create captured context
cctx( std::allocator_arg, preallocated( sp, size, sctx), salloc, entry_func) {
}
...
};
[heading exception handling]
If the function executed inside a __ccontext__ emits ans exception, the
application is terminated by calling ['std::terminate(). ['std::exception_ptr]
can be used to transfer exceptions between different execution contexts.
[heading parameter passing]
The void pointer argument passed to __cc_op__, in one context, is passed as
the last argument of the __context_fn__ if the context is started for the
first time.
In all following invocations of __cc_op__ the void pointer passed to
__cc_op__, in one context, is returned by __cc_op__ in the other context.
class X {
private:
std::exception_ptr excptr_;
boost::context::captured_context ctx_;
public:
X() :
excptr_(),
ctx_( [=](ctx::captured_context ctx, void * vp)->ctx::captured_context{
try {
for (;;) {
int i = * static_cast< int * >( vp);
std::string str = boost::lexical_cast<std::string>(i);
auto result = ctx( & str);
ctx = std::move( std::get<0>( result) );
vp = std::get<1>( result);
}
} catch ( ctx::detail::forced_unwind const&) {
throw;
} catch (...) {
excptr_=std::current_exception();
}
return ctx;
})
{}
std::string operator()( int i) {
auto result = ctx_( & i);
ctx_ = std::move( std::get<0>( result) );
void * ret = std::get<1>( result);
if(excptr_){
std::rethrow_exception(excptr_);
}
return * static_cast< std::string * >( ret);
}
};
X x;
std::cout << x( 7) << std::endl;
output:
7
[heading Class `captured_context`]
class captured_context {
public:
template< typename Fn, typename ... Args >
captured_context( Fn && fn, Args && ... args);
template< typename StackAlloc, typename Fn, typename ... Args >
captured_context( std::allocator_arg_t, StackAlloc salloc, Fn && fn, Args && ... args);
template< typename StackAlloc, typename Fn, typename ... Args >
captured_context( std::allocator_arg_t, preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args);
~captured_context();
captured_context( captured_context && other) noexcept;
captured_context & operator=( captured_context && other) noexcept;
captured_context( captured_context const& other) noexcept = delete;
captured_context & operator=( captured_context const& other) noexcept = delete;
explicit operator bool() const noexcept;
bool operator!() const noexcept;
std::tuple< captured_context, void * > operator()( void * data = nullptr);
template< typename Fn, typename ... Args >
std::tuple< captured_context, void * > operator()( exec_ontop_arg_t, Fn && fn, Args && ... args);
template< typename Fn, typename ... Args >
std::tuple< captured_context, void * > operator()( void * data, exec_ontop_arg_t, Fn && fn, Args && ... args);
bool operator==( captured_context const& other) const noexcept;
bool operator!=( captured_context const& other) const noexcept;
bool operator<( captured_context const& other) const noexcept;
bool operator>( captured_context const& other) const noexcept;
bool operator<=( captured_context const& other) const noexcept;
bool operator>=( captured_context const& other) const noexcept;
template< typename charT, class traitsT >
friend std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, captured_context const& other);
};
[constructor_heading captured_context..constructor]
template< typename Fn, typename ... Args >
captured_context( Fn && fn, Args && ... args);
template< typename StackAlloc, typename Fn, typename ... Args >
captured_context( std::allocator_arg_t, StackAlloc salloc, Fn && fn, Args && ... args);
template< typename StackAlloc, typename Fn, typename ... Args >
captured_context( std::allocator_arg_t, preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args);
[variablelist
[[Effects:] [Creates a new execution context and prepares the context to execute
`fn`. `fixedsize_stack` is used as default stack allocator (stack size == fixedsize_stack::traits::default_size().]]
]
[[Effects:] [Creates a new execution context and prepares the context to execute
`fn`.]]
]
[[Effects:] [Creates a new execution context and prepares the context to execute
`fn`. Used to store control structures on top of the stack.]]
]
[move_constructor_heading captured_context..move constructor]
captured_context( captured_context && other) noexcept;
[variablelist
[[Effects:] [Moves underlying capture record to `*this`.]]
[[Throws:] [Nothing.]]
]
[move_assignment_heading captured_context..move assignment]
captured_context & operator=( captured_context && other) noexcept;
[variablelist
[[Effects:] [Moves the state of `other` to `*this` using move semantics.]]
[[Throws:] [Nothing.]]
]
[operator_heading captured_context..operator_bool..operator bool]
explicit operator bool() const noexcept;
[variablelist
[[Returns:] [`true` if `*this` points to a capture record.]]
[[Throws:] [Nothing.]]
]
[operator_heading captured_context..operator_not..operator!]
bool operator!() const noexcept;
[variablelist
[[Returns:] [`true` if `*this` does not point to a capture record.]]
[[Throws:] [Nothing.]]
]
[operator_heading captured_context..operator_call..operator()]
std::tuple< captured_context, void * > operator()( void * data = nullptr);
template< typename Fn, typename ... Args >
std::tuple< captured_context, void * > operator()( exec_ontop_arg_t, Fn && fn, Args && ... args);
template< typename Fn, typename ... Args >
std::tuple< captured_context, void * > operator()( void * data, exec_ontop_arg_t, Fn && fn, Args && ... args);
[variablelist
[[Effects:] [Stores internally the current context data (stack pointer,
instruction pointer, and CPU registers) of the current active context and
restores the context data from `*this`, which implies jumping to `*this`'s
context.
The void pointer argument, `vp`, is passed to the current context to be returned
by the most recent call to `captured_context::operator()` in the same thread.
`fn` is executed with arguments `args` on top of the stack of `this`.
[[Note:] [The behaviour is undefined if `operator()()` is called while `captured_context::current()`
returns `*this` (e.g. resuming an already running context). If the top-level context
function returns, `std::exit()` is called.]]
[[Returns:] [The tuple of void pointer argument passed to the most recent call to
`captured_context::operator()`, if any and a captured_context representing the context
that has been suspended .]]
]
[operator_heading captured_context..operator_equal..operator==]
bool operator==( captured_context const& other) const noexcept;
[variablelist
[[Returns:] [`true` if `*this` and `other` represent the same execution context,
`false` otherwise.]]
[[Throws:] [Nothing.]]
]
[operator_heading captured_context..operator_notequal..operator!=]
bool operator!=( captured_context const& other) const noexcept;
[variablelist
[[Returns:] [[`! (other == * this)]]]
[[Throws:] [Nothing.]]
]
[operator_heading captured_context..operator_less..operator<]
bool operator<( captured_context const& other) const noexcept;
[variablelist
[[Returns:] [`true` if `*this != other` is true and the
implementation-defined total order of `captured_context` values places `*this` before
`other`, false otherwise.]]
[[Throws:] [Nothing.]]
]
[operator_heading captured_context..operator_greater..operator>]
bool operator>( captured_context const& other) const noexcept;
[variablelist
[[Returns:] [`other < * this`]]
[[Throws:] [Nothing.]]
]
[operator_heading captured_context..operator_lesseq..operator<=]
bool operator<=( captured_context const& other) const noexcept;
[variablelist
[[Returns:] [`! (other < * this)`]]
[[Throws:] [Nothing.]]
]
[operator_heading captured_context..operator_greatereq..operator>=]
bool operator>=( captured_context const& other) const noexcept;
[variablelist
[[Returns:] [`! (* this < other)`]]
[[Throws:] [Nothing.]]
]
[hding captured_context..Non-member function [`operator<<()]]
template< typename charT, class traitsT >
std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, captured_context const& other);
[variablelist
[[Efects:] [Writes the representation of `other` to stream `os`.]]
[[Returns:] [`os`]]
]
[endsect]

View File

@@ -23,10 +23,84 @@
[def __boost_build__ [*Boost.Build]]
[def __boost_context__ [*Boost.Context]]
[template cs_example_link[link_text] [link context.examples.enumerator [link_text]]]
[template context_link[link_text] [link context.context.context [link_text]]]
[template stack_link[link_text] [link context.stack [link_text]]]
[template preformance_link[link_text] [link context.performance [link_text]]]
[template mdash[] '''&mdash;''']
[template superscript[exp] '''<superscript>'''[exp]'''</superscript>''']
[template class_heading[class_name]
[hding class_[class_name]..Class [`[class_name]]]
]
[template class_link[class_name] [dblink class_[class_name]..[`[class_name]]]]
[template template_heading[class_name]
[hding class_[class_name]..Template [`[class_name]<>]]
]
[template template_link[class_name] [dblink class_[class_name]..[`[class_name]<>]]]
[template member_heading[class_name method_name]
[operator_heading [class_name]..[method_name]..[method_name]]
]
[template member_link[class_name method_name] [operator_link [class_name]..[method_name]..[method_name]]]
[template operator_heading[class_name method_name method_text]
[hding [class_name]_[method_name]..Member function [`[method_text]]()]
]
[template operator_link[class_name method_name method_text] [dblink [class_name]_[method_name]..[`[class_name]::[method_text]()]]]
[template template_member_heading[class_name method_name]
[hding [class_name]_[method_name]..Templated member function [`[method_name]]()]
]
[template template_member_link[class_name method_name] [member_link [class_name]..[method_name]]]
[template static_member_heading[class_name method_name]
[hding [class_name]_[method_name]..Static member function [`[method_name]]()]
]
[template static_member_link[class_name method_name] [member_link [class_name]..[method_name]]]
[template data_member_heading[class_name member_name]
[hding [class_name]_[member_name]..Data member [`[member_name]]]
]
[template data_member_link[class_name member_name] [dblink [class_name]_[member_name]..[`[class_name]::[member_name]]]]
[template function_heading[function_name]
[hding [function_name]..Non-member function [`[function_name]()]]
]
[template function_link[function_name] [dblink [function_name]..[`[function_name]()]]]
[template ns_function_heading[namespace function_name]
[hding [namespace]_[function_name]..Non-member function [`[namespace]::[function_name]()]]
]
[template ns_function_link[namespace function_name] [dblink [namespace]_[function_name]..[`[namespace]::[function_name]()]]]
[template constructor_heading[class_name constructor_name]
[hding [class_name]_[constructor_name]..Constructor]
]
[template copy_constructor_heading[class_name copy_constructor_name]
[hding [class_name]_[copy_constructor_name]..Copy constructor]
]
[template move_constructor_heading[class_name move_constructor_name]
[hding [class_name]_[move_constructor_name]..Move constructor]
]
[template copy_assignment_heading[class_name copy_assignment_name]
[hding [class_name]_[copy_assignment_name]..Copy assignment operator]
]
[template move_assignment_heading[class_name move_assignment_name]
[hding [class_name]_[move_assignment_name]..Move assignment operator]
]
[template anchor[name] '''<anchor id="'''[name]'''"/>''']
[template hding[name title]
'''<bridgehead renderas="sect4" id="'''[name]_bridgehead'''">
<phrase id="'''[name]'''"/>
<link linkend="'''[name]'''">'''[title]'''</link>
</bridgehead>'''
]
[template dblink[id text] '''<link linkend="'''[id]'''">'''[text]'''</link>''']
[template `[text] '''<code>'''[text]'''</code>''']
[def __context_fn__ ['context-function]]
[def __coroutine__ ['coroutine]]
@@ -35,14 +109,16 @@
[def __fls__ ['fiber-local storage]]
[def __guard_page__ ['guard-page]]
[def __not_a_context__ ['not-a-context]]
[def __stack__ [stack_link ['stack]]]
[def __stack__ ['stack]]
[def __thread__ ['thread]]
[def __threads__ ['threads]]
[def __tls__ ['thread-local storage]]
[def __toe__ ['thread-of-execution]]
[def __stack_allocator__ ['StackAllocator]]
[def __stack_allocator_concept__ ['stack-allocator concept]]
[def __stack_traits__ ['stack-traits]]
[def __ccontext__ ['captured_context]]
[def __econtext__ ['execution_context]]
[def __fcontext__ ['fcontext_t]]
[def __ucontext__ ['ucontext_t]]
@@ -55,6 +131,8 @@
[def __fls_free__ ['::FlsFree()]]
[def __bad_alloc__ ['std::bad_alloc]]
[def __cc_op__ ['captured_context::operator()]]
[def __ec_current__ ['execution_context::current()]]
[def __ec_op__ ['execution_context::operator()]]
[def __fc_base__ ['fc_base]]
[def __fc_link__ ['fc_link]]
@@ -70,9 +148,11 @@
[include overview.qbk]
[include requirements.qbk]
[include fcontext.qbk]
[/[include fcontext.qbk]]
[include execution_context.qbk]
[include captured_context.qbk]
[include stack.qbk]
[include preallocated.qbk]
[include performance.qbk]
[include architectures.qbk]
[include rationale.qbk]

File diff suppressed because it is too large Load Diff

View File

@@ -5,14 +5,66 @@
http://www.boost.org/LICENSE_1_0.txt
]
[#econtext]
[section:econtext Class execution_context]
[important __econtext__ requires C++11!]
Class __econtext__ encapsulates __fcontext__ and manages the context' stack
(allocation/deallocation).
Class __econtext__ encapsulates __fcontext__ and related functions (
__jump_fcontext__ and __make_fcontext__) as well as stack management.
__econtext__ permits access to the current, active context via
`execution_context::current()`.
__econtext__ allocates the context stack (using its [link stack __stack_allocator__]
argument) and creates a control structure on top of it. This structure
controls the life time of the stack. Instances of __econtext__, associated
with a specific context, share the ownership of the control structure.
If the last reference goes out of scope, the control structure is destroyed and
the stack gets deallocated via the __stack_allocator__.
__econtext__ is copy-constructible, move-constructible, copy-assignable and
move-assignable.
__econtext__ maintains a static, thread-local pointer (smart pointer),
accessed by __ec_current__, pointing to the active context.
On each context switch the static thread-local pointer is updated.
The usage of this global pointer makes the context switch a little bit slower
(due access of thread local storage) but has some advantages. It allows to access
the control structure of the current active context from arbitrary code paths
required in order to support segmented stacks, which need to call certain
maintenance functions (__splitstack_getcontext() etc.) before each context switch
(each context switch exchanges the stack).
Additionally the destruction of __econtext__ and thus the stack deallocation is
faster compared to [link ccontext __ccontext__].
__econtext__ expects a function/functor with signature `void(void* vp)` (
`vp` is the data passed at the first invocation of
[operator_link execution_context operator_call operator()]).
[heading usage of __econtext__]
int n=35;
int p=0;
boost::context::execution_context mctx( boost::context::execution_context::current() );
boost::context::execution_context ctx(
[n,&p,&mctx](void*)mutable{
int a=0;
int b=1;
while(n-->0){
yield(a);
auto next=a+b;
a=b;
b=next;
}
});
for(int i=0;i<10;++i){
ctx();
std::cout<<p<<" ";
}
output:
0 1 1 2 3 5 8 13 21 34
This simple example demonstrates the basic usage of __econtext__.
[heading inverting the control flow]
/*
* grammar:
@@ -80,16 +132,16 @@ __econtext__ permits access to the current, active context via
Parsed: 1
In this example a recursive descent parser uses a callback to emit a newly passed
symbol. Using __econtext__ the control flow can be inverted, e.g. the user-code
pulls parsed symbols from the parser - instead to get pushed from the parser
(via callback).
In this example a recursive descent parser uses a callback to emit a newly
passed symbol. Using __econtext__ the control flow can be inverted, e.g. the
user-code pulls parsed symbols from the parser - instead to get pushed from the
parser (via callback).
The data (character) is transferred between the two __econtext__.
If the code executed by __econtext__ emits an exception, the application is terminated.
['std::exception_ptr] can be used to transfer exceptions between different execution
contexts.
If the code executed by __econtext__ emits an exception, the application is
terminated. ['std::exception_ptr] can be used to transfer exceptions between
different execution contexts.
Sometimes it is necessary to unwind the stack of an unfinished context to
destroy local stack variables so they can release allocated resources (RAII
@@ -169,11 +221,11 @@ __ec_op__, in one context, is returned by __ec_op__ in the other context.
}
};
int main() {
X x;
std::cout << x( 7) << std::endl;
std::cout << "done" << std::endl;
}
X x;
std::cout << x( 7) << std::endl;
output:
7
[heading Class `execution_context`]
@@ -200,18 +252,24 @@ __ec_op__, in one context, is returned by __ec_op__ in the other context.
explicit operator bool() const noexcept;
bool operator!() const noexcept;
void * operator()( void * vp = nullptr) noexcept;
void * operator()( void * vp = nullptr);
template< typename Fn, typename ... Args >
void * operator()( exec_ontop_arg_t, Fn && fn, Args && ... args);
template< typename Fn, typename ... Args >
void * operator()( void * vp, exec_ontop_arg_t, Fn && fn, Args && ... args);
bool operator==( execution_context const& other) const noexcept;
bool operator!=( execution_context const& other) const noexcept;
bool operator<( execution_context const& other) const noexcept;
bool operator>( execution_context const& other) const noexcept;
bool operator<=( execution_context const& other) const noexcept;
bool operator>=( execution_context const& other) const noexcept;
template< typename charT, class traitsT >
@@ -219,87 +277,128 @@ __ec_op__, in one context, is returned by __ec_op__ in the other context.
operator<<( std::basic_ostream< charT, traitsT > & os, execution_context const& other);
};
[heading `static execution_context current()`]
[static_member_heading execution_context..current]
static execution_context current() noexcept;
[variablelist
[[Returns:] [Returns an instance of excution_context pointing to the active
execution context.]]
[[Throws:] [Nothing.]]
]
[heading `template< typname Fn, typename ... Args > execution_context( Fn && fn, Args && ... args)`]
[constructor_heading execution_context..constructor]
template< typename Fn, typename ... Args >
execution_context( Fn && fn, Args && ... args);
template< typename StackAlloc, typename Fn, typename ... Args >
execution_context( std::allocator_arg_t, StackAlloc salloc, Fn && fn, Args && ... args);
template< typename StackAlloc, typename Fn, typename ... Args >
execution_context( std::allocator_arg_t, preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args);
[variablelist
[[Effects:] [Creates a new execution context and prepares the context to execute
`fn`. `fixedsize_stack` is used as default stack allocator (stack size == fixedsize_stack::traits::default_size().]]
`fn`. `fixedsize_stack` is used as default stack allocator
(stack size == fixedsize_stack::traits::default_size()).
The constructor with argument type `preallocated`, is used to store control
structures on top of the stack.]]
]
[heading `template< typename StackAlloc, typname Fn, typename ... Args > execution_context( std::allocator_arg_t, StackAlloc salloc, Fn && fn, Args && ... args)`]
[variablelist
[[Effects:] [Creates a new execution context and prepares the context to execute
`fn`.]]
]
[copy_constructor_heading execution_context..copy constructor]
[heading `template< typename StackAlloc, typname Fn, typename ... Args > execution_context( std::allocator_arg_t, preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args)`]
[variablelist
[[Effects:] [Creates a new execution context and prepares the context to execute
`fn`. Used to store control structures on top of the stack.]]
]
execution_context( execution_context const& other) noexcept;
[heading `execution_context( execution_context const& other)`]
[variablelist
[[Effects:] [Copies `other`, e.g. underlying capture record is shared
with `*this`.]]
[[Throws:] [Nothing.]]
]
[heading `execution_context( execution_context && other)`]
[move_constructor_heading execution_context..move constructor]
execution_context( execution_context && other) noexcept;
[variablelist
[[Effects:] [Moves underlying capture record to `*this`.]]
[[Throws:] [Nothing.]]
]
[heading `execution_context & operator=( execution_context const& other)`]
[copy_assignment_heading execution_context..copy assignment]
execution_context & operator=( execution_context const& other) noexcept;
[variablelist
[[Effects:] [Copies the state of `other` to `*this`, state (capture record) is shared.]]
[[Throws:] [Nothing.]]
]
[heading `execution_context & operator=( execution_context && other)`]
[move_assignment_heading execution_context..move assignment]
execution_context & operator=( execution_context && other) noexcept;
[variablelist
[[Effects:] [Moves the state of `other` to `*this` using move semantics.]]
[[Throws:] [Nothing.]]
]
[heading `explicit operator bool() const noexcept`]
[operator_heading execution_context..operator_bool..operator bool]
explicit operator bool() const noexcept;
[variablelist
[[Returns:] [`true` if `*this` points to a capture record.]]
[[Throws:] [Nothing.]]
]
[heading `bool operator!() const noexcept`]
[operator_heading execution_context..operator_not..operator!]
bool operator!() const noexcept;
[variablelist
[[Returns:] [`true` if `*this` does not point to a capture record.]]
[[Throws:] [Nothing.]]
]
[heading `void * operator()( void * vp) noexcept`]
[operator_heading execution_context..operator_call..operator()]
void * operator()( void * vp = nullptr) noexcept;
[variablelist
[[Effects:] [Stores internally the current context data (stack pointer,
instruction pointer, and CPU registers) to the current active context and
instruction pointer, and CPU registers) of the current active context and
restores the context data from `*this`, which implies jumping to `*this`'s
execution context.
context.
The void pointer argument, `vp`, is passed to the current context to be returned
by the most recent call to `execution_context::operator()` in the same thread.
`fn` is executed with arguments `args` on top of the stack of `this`.
[[Note:] [The behaviour is undefined if `operator()()` is called while `execution_context::current()`
returns `*this` (e.g. resuming an already running context). If the top-level context
function returns, `std::exit()` is called.]]
[[Returns:] [The void pointer argument passed to the most recent call to
`execution_context::operator()`, if any.]]
[[Throws:] [Nothing.]]
]
[heading `operator==`]
[operator_heading execution_context..operator_call..operator(exec_ontop_arg_t)]
bool operator==( execution_context const& other) const noexcept;
template< typename Fn, typename ... Args >
void * operator()( exec_ontop_arg_t, Fn && fn, Args && ... args);
template< typename Fn, typename ... Args >
void * operator()( void * data, exec_ontop_arg_t, Fn && fn, Args && ... args);
[variablelist
[[Effects:] [Same as `operator()(void*)`, additionally function `fn` is executed
with arguments `args` in the context of `*this` (e.g. the stack frame of `fn` is
allocated on stack of `*this`.]]
[[Returns:] [The void pointer argument passed to the most recent call to
`execution_context::operator()`, if any.]]
]
[operator_heading execution_context..operator_equal..operator==]
bool operator==( execution_context const& other) const noexcept;
[variablelist
[[Returns:] [`true` if `*this` and `other` represent the same execution context,
@@ -307,18 +406,18 @@ function returns, `std::exit()` is called.]]
[[Throws:] [Nothing.]]
]
[heading `operator!=`]
[operator_heading execution_context..operator_notequal..operator!=]
bool operator!=( execution_context const& other) const noexcept;
bool operator!=( execution_context const& other) const noexcept;
[variablelist
[[Returns:] [[`! (other == * this)]]]
[[Throws:] [Nothing.]]
]
[heading `operator<`]
[operator_heading execution_context..operator_less..operator<]
bool operator<( execution_context const& other) const noexcept;
bool operator<( execution_context const& other) const noexcept;
[variablelist
[[Returns:] [`true` if `*this != other` is true and the
@@ -327,38 +426,38 @@ implementation-defined total order of `execution_context` values places `*this`
[[Throws:] [Nothing.]]
]
[heading `operator>`]
[operator_heading execution_context..operator_greater..operator>]
bool operator>( execution_context const& other) const noexcept;
bool operator>( execution_context const& other) const noexcept;
[variablelist
[[Returns:] [`other < * this`]]
[[Throws:] [Nothing.]]
]
[heading `operator<=`]
[operator_heading execution_context..operator_lesseq..operator<=]
bool operator<=( execution_context const& other) const noexcept;
bool operator<=( execution_context const& other) const noexcept;
[variablelist
[[Returns:] [`! (other < * this)`]]
[[Throws:] [Nothing.]]
]
[heading `operator>=`]
[operator_heading execution_context..operator_greatereq..operator>=]
bool operator>=( execution_context const& other) const noexcept;
bool operator>=( execution_context const& other) const noexcept;
[variablelist
[[Returns:] [`! (* this < other)`]]
[[Throws:] [Nothing.]]
]
[heading `operator<<`]
[hding execution_context..Non-member function [`operator<<()]]
template< typename charT, class traitsT >
std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, execution_context const& other);
template< typename charT, class traitsT >
std::basic_ostream< charT, traitsT > &
operator<<( std::basic_ostream< charT, traitsT > & os, execution_context const& other);
[variablelist
[[Efects:] [Writes the representation of `other` to stream `os`.]]
@@ -366,20 +465,4 @@ implementation-defined total order of `execution_context` values places `*this`
]
[heading Struct `preallocated`]
struct preallocated {
void * sp;
std::size_t size;
stack_context sctx;
preallocated( void * sp, std:size_t size, stack_allocator sctx) noexcept;
};
[heading `preallocated( void * sp, std:size_t size, stack_allocator sctx)`]
[variablelist
[[Effects:] [Creates an object of preallocated.]]
]
[endsect]

View File

@@ -187,11 +187,11 @@ downwards or upwards).]]
[[Member:] [Tracks the memory for the context's stack.]]
]
[heading `void * jump_fcontext(fcontext_t* ofc,fcontext_t nfc,void * p)
[heading `void * jump_fcontext(fcontext_t* ofc,fcontext_t nfc,void * p)`]
[variablelist
[[Effects:] [Stores the current context data (stack pointer, instruction
pointer, and CPU registers) to `*ofc` and restores the context data from `nfc`,
which implies jumping to `nfc`'s execution context. The void * argument, `p`,
which implies jumping to execution context `nfc`. The void * argument, `p`,
is passed to the current context to be returned by the most recent call to
`jump_fcontext()` in the same thread.]]
[[Returns:] [The third pointer argument passed to the most recent call to

View File

@@ -0,0 +1,72 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Context classes</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="prev" href="requirements.html" title="Requirements">
<link rel="next" href="abstract_context/econtext.html" title="Class execution_context">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
<td align="center"><a href="../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="abstract_context/econtext.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="context.abstract_context"></a><a class="link" href="abstract_context.html" title="Context classes">Context classes</a>
</h2></div></div></div>
<div class="toc"><dl>
<dt><span class="section"><a href="abstract_context/econtext.html">Class execution_context</a></span></dt>
<dt><span class="section"><a href="abstract_context/ccontext.html">Class captured_context</a></span></dt>
<dt><span class="section"><a href="abstract_context/stack.html">Stack allocation</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="abstract_context/stack/protected_fixedsize.html">Class
<span class="emphasis"><em>protected_fixedsize</em></span></a></span></dt>
<dt><span class="section"><a href="abstract_context/stack/fixedsize.html">Class <span class="emphasis"><em>fixedsize_stack</em></span></a></span></dt>
<dt><span class="section"><a href="abstract_context/stack/segmented.html">Class <span class="emphasis"><em>segmented_stack</em></span></a></span></dt>
<dt><span class="section"><a href="abstract_context/stack/stack_traits.html">Class
<span class="emphasis"><em>stack_traits</em></span></a></span></dt>
<dt><span class="section"><a href="abstract_context/stack/stack_context.html">Class
<span class="emphasis"><em>stack_context</em></span></a></span></dt>
<dt><span class="section"><a href="abstract_context/stack/valgrind.html">Support for
valgrind</a></span></dt>
</dl></dd>
</dl></div>
<p>
<span class="bold"><strong>Boost.Context</strong></span> provides two classes encapsulating
<span class="emphasis"><em>fcontext_t</em></span> and related functions (<span class="emphasis"><em>jump_fcontext()</em></span>
and <span class="emphasis"><em>make_fcontext()</em></span>) and stack management - <span class="emphasis"><em>execution_context</em></span>
and <span class="emphasis"><em>captured_context</em></span>. <span class="emphasis"><em>execution_context</em></span>
and <span class="emphasis"><em>captured_context</em></span> represent one <span class="emphasis"><em>thread-of-execution</em></span>.
A <span class="emphasis"><em>thread-of-execution</em></span> is a single flow of control within
a programm. Each class maintains a control structure, containing the preserved
registers, the stack and the stack allocator. The main difference between
<span class="emphasis"><em>execution_context</em></span> and <span class="emphasis"><em>captured_context</em></span>
consists in maintaining context' control structure.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="abstract_context/econtext.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,739 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Class captured_context</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../abstract_context.html" title="Context classes">
<link rel="prev" href="econtext.html" title="Class execution_context">
<link rel="next" href="stack.html" title="Stack allocation">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="econtext.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../abstract_context.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="context.abstract_context.ccontext"></a><a class="link" href="ccontext.html" title="Class captured_context">Class captured_context</a>
</h3></div></div></div>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
<span class="emphasis"><em>captured_context</em></span> requires C++11!
</p></td></tr>
</table></div>
<p>
Class <span class="emphasis"><em>captured_context</em></span> encapsulates <span class="emphasis"><em>fcontext_t</em></span>
and manages the context' stack (allocation/deallocation).
</p>
<p>
<span class="emphasis"><em>captured_context</em></span> allocates the context stack (using
its <span class="emphasis"><em>StackAllocator</em></span> argument) and creates a control structure
on top of it. This structure controls the life time of the stack. The address
of the control structure is stored in the first frame of context' stack (e.g.
it can not accessed by instances of <span class="emphasis"><em>captured_context</em></span>
directly). In contrast to <span class="emphasis"><em>execution_context</em></span> the ownership
of the control structure is not shared A call of<span class="emphasis"><em>captured_context::operator()</em></span>
enters the context represented by <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and invalidates <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. The context that has been suspended
by calling <span class="emphasis"><em>captured_context::operator()</em></span> is passed to
the resumed context, e.g. as argument of the context-function if the context
was resumed the first time or returned by <span class="emphasis"><em>captured_context::operator()</em></span>.
<span class="emphasis"><em>captured_context</em></span> is only move-constructible and move-assignable.
If the last reference (<span class="emphasis"><em>captured_context</em></span>) goes out of
scope, the control structure is destroyed and the stack gets deallocated
via the <span class="emphasis"><em>StackAllocator</em></span>. <span class="emphasis"><em>captured_context</em></span>
maintains a static, thread-local pointer (smart pointer), accessed by <span class="emphasis"><em>execution_context::current()</em></span>,
pointing to the active context. On each context switch the static, thread-local
pointer is updated. This makes the context switch a little bit slower, but
enables faster context destruction (stack unwinding) compared to <span class="emphasis"><em>captured_context</em></span>.
</p>
<p>
<span class="emphasis"><em>captured_context</em></span> expects a function/functor with signature
<code class="computeroutput"><span class="identifier">captured_context</span><span class="special">(</span>
<span class="identifier">captured_context</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span>
<span class="identifier">vp</span><span class="special">)</span></code>.
The parameter <code class="computeroutput"><span class="identifier">ctx</span></code> represents
the context from which this context was resumed (e.g. that has called <span class="emphasis"><em>captured_context::operator()</em></span>
on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>)
and <code class="computeroutput"><span class="identifier">vp</span></code> is the data passed
to <span class="emphasis"><em>captured_context::operator()</em></span>. The function/functor
has to return the captured_context that has to be resumed, while this context
terminates.
</p>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
Segemnted stacks are not supported together with <span class="emphasis"><em>captured_context</em></span>.
</p></td></tr>
</table></div>
<h5>
<a name="context.abstract_context.ccontext.h0"></a>
<span><a name="context.abstract_context.ccontext.usage_of__emphasis_captured_context__emphasis_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext.usage_of__emphasis_captured_context__emphasis_">usage
of <span class="emphasis"><em>captured_context</em></span></a>
</h5>
<pre class="programlisting"><span class="comment">/*
* grammar:
* P ---&gt; E '\0'
* E ---&gt; T {('+'|'-') T}
* T ---&gt; S {('*'|'/') S}
* S ---&gt; digit | '(' E ')'
*/</span>
<span class="keyword">class</span> <span class="identifier">Parser</span><span class="special">{</span>
<span class="comment">// implementation omitted; see examples directory</span>
<span class="special">};</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">istringstream</span> <span class="identifier">is</span><span class="special">(</span><span class="string">"1+1"</span><span class="special">);</span>
<span class="keyword">bool</span> <span class="identifier">done</span><span class="special">=</span><span class="keyword">false</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">except</span><span class="special">;</span>
<span class="comment">// execute parser in new execution context</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">captured_context</span> <span class="identifier">pctx</span><span class="special">(</span>
<span class="special">[&amp;</span><span class="identifier">is</span><span class="special">,&amp;</span><span class="identifier">done</span><span class="special">,&amp;</span><span class="identifier">except</span><span class="special">](</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">captured_context</span> <span class="identifier">mctx</span><span class="special">,</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">ignored</span><span class="special">){</span>
<span class="comment">// create parser with callback function</span>
<span class="identifier">Parser</span> <span class="identifier">p</span><span class="special">(</span> <span class="identifier">is</span><span class="special">,</span>
<span class="special">[&amp;</span><span class="identifier">mctx</span><span class="special">](</span><span class="keyword">char</span> <span class="identifier">ch</span><span class="special">){</span>
<span class="comment">// resume main execution context</span>
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">mctx</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">ch</span><span class="special">);</span>
<span class="identifier">mctx</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
<span class="special">});</span>
<span class="keyword">try</span> <span class="special">{</span>
<span class="comment">// start recursive parsing</span>
<span class="identifier">p</span><span class="special">.</span><span class="identifier">run</span><span class="special">();</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span> <span class="special">...</span> <span class="special">)</span> <span class="special">{</span>
<span class="comment">// store other exceptions in exception-pointer</span>
<span class="identifier">except</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">current_exception</span><span class="special">();</span>
<span class="special">}</span>
<span class="comment">// set termination flag</span>
<span class="identifier">done</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
<span class="comment">// resume main execution context</span>
<span class="keyword">return</span> <span class="identifier">mctx</span><span class="special">;</span>
<span class="special">});</span>
<span class="comment">// user-code pulls parsed data from parser</span>
<span class="comment">// invert control flow</span>
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">pctx</span><span class="special">();</span>
<span class="identifier">pctx</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span> <span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span> <span class="identifier">except</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">while</span><span class="special">(</span> <span class="special">!</span> <span class="identifier">done</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">printf</span><span class="special">(</span><span class="string">"Parsed: %c\n"</span><span class="special">,*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">char</span><span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">vp</span><span class="special">)</span> <span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">pctx</span><span class="special">,</span><span class="identifier">vp</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">pctx</span><span class="special">();</span>
<span class="keyword">if</span> <span class="special">(</span> <span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span> <span class="identifier">except</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">}</span>
<span class="identifier">output</span><span class="special">:</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="special">+</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
</pre>
<p>
In this example a recursive descent parser uses a callback to emit a newly
passed symbol. Using <span class="emphasis"><em>captured_context</em></span> the control flow
can be inverted, e.g. the user-code pulls parsed symbols from the parser
- instead to get pushed from the parser (via callback).
</p>
<p>
The data (character) is transferred between the two <span class="emphasis"><em>captured_context</em></span>.
</p>
<p>
If the code executed by <span class="emphasis"><em>captured_context</em></span> emits an exception,
the application is terminated. <span class="emphasis"><em>std::exception_ptr</em></span> can
be used to transfer exceptions between different execution contexts.
</p>
<p>
Sometimes it is necessary to unwind the stack of an unfinished context to
destroy local stack variables so they can release allocated resources (RAII
pattern). The user is responsible for this task.
</p>
<h5>
<a name="context.abstract_context.ccontext.h1"></a>
<span><a name="context.abstract_context.ccontext.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext.allocating_control_structures_on_top_of_stack">allocating
control structures on top of stack</a>
</h5>
<p>
Allocating control structures on top of the stack requires to allocated the
<span class="emphasis"><em>stack_context</em></span> and create the control structure with
placement new before <span class="emphasis"><em>captured_context</em></span> is created.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
The user is responsible for destructing the control structure at the top
of the stack.
</p></td></tr>
</table></div>
<pre class="programlisting"><span class="comment">// stack-allocator used for (de-)allocating stack</span>
<span class="identifier">fixedsize_stack</span> <span class="identifier">salloc</span><span class="special">(</span> <span class="number">4048</span><span class="special">);</span>
<span class="comment">// allocate stack space</span>
<span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">(</span> <span class="identifier">salloc</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">()</span> <span class="special">);</span>
<span class="comment">// reserve space for control structure on top of the stack</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">char</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span><span class="special">)</span> <span class="special">-</span> <span class="keyword">sizeof</span><span class="special">(</span> <span class="identifier">my_control_structure</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span> <span class="special">-</span> <span class="keyword">sizeof</span><span class="special">(</span> <span class="identifier">my_control_structure</span><span class="special">);</span>
<span class="comment">// placement new creates control structure on reserved space</span>
<span class="identifier">my_control_structure</span> <span class="special">*</span> <span class="identifier">cs</span> <span class="special">=</span> <span class="keyword">new</span> <span class="special">(</span> <span class="identifier">sp</span><span class="special">)</span> <span class="identifier">my_control_structure</span><span class="special">(</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">sctx</span><span class="special">,</span> <span class="identifier">salloc</span><span class="special">);</span>
<span class="special">...</span>
<span class="comment">// destructing the control structure</span>
<span class="identifier">cs</span><span class="special">-&gt;~</span><span class="identifier">my_control_structure</span><span class="special">();</span>
<span class="special">...</span>
<span class="keyword">struct</span> <span class="identifier">my_control_structure</span> <span class="special">{</span>
<span class="comment">// captured context</span>
<span class="identifier">captured_context</span> <span class="identifier">cctx</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAllocator</span> <span class="special">&gt;</span>
<span class="identifier">my_control_structure</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">,</span> <span class="identifier">StackAllocator</span> <span class="identifier">salloc</span><span class="special">)</span> <span class="special">:</span>
<span class="comment">// create captured context</span>
<span class="identifier">cctx</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg</span><span class="special">,</span> <span class="identifier">preallocated</span><span class="special">(</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">sctx</span><span class="special">),</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">entry_func</span><span class="special">)</span> <span class="special">{</span>
<span class="special">}</span>
<span class="special">...</span>
<span class="special">};</span>
</pre>
<h5>
<a name="context.abstract_context.ccontext.h2"></a>
<span><a name="context.abstract_context.ccontext.exception_handling"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext.exception_handling">exception
handling</a>
</h5>
<p>
If the function executed inside a <span class="emphasis"><em>captured_context</em></span> emits
ans exception, the application is terminated by calling ['std::terminate().
<span class="emphasis"><em>std::exception_ptr</em></span> can be used to transfer exceptions
between different execution contexts.
</p>
<h5>
<a name="context.abstract_context.ccontext.h3"></a>
<span><a name="context.abstract_context.ccontext.parameter_passing"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext.parameter_passing">parameter
passing</a>
</h5>
<p>
The void pointer argument passed to <span class="emphasis"><em>captured_context::operator()</em></span>,
in one context, is passed as the last argument of the <span class="emphasis"><em>context-function</em></span>
if the context is started for the first time. In all following invocations
of <span class="emphasis"><em>captured_context::operator()</em></span> the void pointer passed
to <span class="emphasis"><em>captured_context::operator()</em></span>, in one context, is
returned by <span class="emphasis"><em>captured_context::operator()</em></span> in the other
context.
</p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span>
<span class="keyword">private</span><span class="special">:</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">excptr_</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">captured_context</span> <span class="identifier">ctx_</span><span class="special">;</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="identifier">X</span><span class="special">()</span> <span class="special">:</span>
<span class="identifier">excptr_</span><span class="special">(),</span>
<span class="identifier">ctx_</span><span class="special">(</span> <span class="special">[=](</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">captured_context</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">)-&gt;</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">captured_context</span><span class="special">{</span>
<span class="keyword">try</span> <span class="special">{</span>
<span class="keyword">for</span> <span class="special">(;;)</span> <span class="special">{</span>
<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">int</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">vp</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="identifier">i</span><span class="special">);</span>
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">ctx</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
<span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span> <span class="identifier">ctx</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">forced_unwind</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">{</span>
<span class="keyword">throw</span><span class="special">;</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span>
<span class="identifier">excptr_</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">current_exception</span><span class="special">();</span>
<span class="special">}</span>
<span class="keyword">return</span> <span class="identifier">ctx</span><span class="special">;</span>
<span class="special">})</span>
<span class="special">{}</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">ctx_</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">i</span><span class="special">);</span>
<span class="identifier">ctx_</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">ret</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">);</span>
<span class="keyword">if</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">){</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">return</span> <span class="special">*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">ret</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">};</span>
<span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">output</span><span class="special">:</span>
<span class="number">7</span>
</pre>
<h5>
<a name="context.abstract_context.ccontext.h4"></a>
<span><a name="context.abstract_context.ccontext.class__code__phrase_role__identifier__captured_context__phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext.class__code__phrase_role__identifier__captured_context__phrase___code_">Class
<code class="computeroutput"><span class="identifier">captured_context</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">captured_context</span> <span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="special">~</span><span class="identifier">captured_context</span><span class="special">();</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">captured_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">captured_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
<span class="identifier">captured_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
<span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
<span class="special">};</span>
</pre>
<h5>
<a name="context.abstract_context.ccontext.h5"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span> <span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span>
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span>
<span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>. <code class="computeroutput"><span class="identifier">fixedsize_stack</span></code>
is used as default stack allocator (stack size == fixedsize_stack::traits::default_size().
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h6"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span>
<span class="special">...</span> <span class="identifier">Args</span>
<span class="special">&gt;</span> <span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span>
<span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span>
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span>
<span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h7"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__preallocated__phrase___phrase_role__identifier__palloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__preallocated__phrase___phrase_role__identifier__palloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span>
<span class="special">...</span> <span class="identifier">Args</span>
<span class="special">&gt;</span> <span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span>
<span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span>
<span class="identifier">salloc</span><span class="special">,</span>
<span class="identifier">Fn</span> <span class="special">&amp;&amp;</span>
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span>
<span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>. Used to store control
structures on top of the stack.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h8"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__captured_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__captured_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">captured_context</span><span class="special">(</span>
<span class="identifier">captured_context</span> <span class="special">&amp;&amp;</span>
<span class="identifier">other</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Moves underlying capture record to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h9"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__identifier__captured_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__captured_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__identifier__captured_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__captured_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">captured_context</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">=(</span>
<span class="identifier">captured_context</span> <span class="special">&amp;&amp;</span>
<span class="identifier">other</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Moves the state of <code class="computeroutput"><span class="identifier">other</span></code>
to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
using move semantics.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h10"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__explicit__phrase___phrase_role__keyword__operator__phrase___phrase_role__keyword__bool__phrase__phrase_role__special______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__explicit__phrase___phrase_role__keyword__operator__phrase___phrase_role__keyword__bool__phrase__phrase_role__special______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
<span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
points to a capture record.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h11"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__bool__phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__bool__phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"><code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
does not point to a capture record.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h12"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__vp__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__vp__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">)</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd>
<p>
Stores internally the current context data (stack pointer, instruction
pointer, and CPU registers) to the current active context and restores
the context data from <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, which implies jumping to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>'s
execution context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
is passed to the current context to be returned by the most recent
call to <code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> in the same thread. [[Note:
</p>
<p>
The behaviour is undefined if <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code> is called while <code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> (e.g. resuming an already running
context). If the top-level context function returns, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exit</span><span class="special">()</span></code>
is called.
</p>
</dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
The void pointer argument passed to the most recent call to <code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>,
if any.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h13"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__tuple__phrase__phrase_role__special___lt___phrase___phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__keyword__void__phrase___phrase_role__special___gt___phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__vp__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__tuple__phrase__phrase_role__special___lt___phrase___phrase_role__identifier__captured_context__phrase__phrase_role__special_____phrase___phrase_role__keyword__void__phrase___phrase_role__special___gt___phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__vp__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">&gt;</span>
<span class="keyword">operator</span><span class="special">()(</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">)</span></code></a>
</h5>
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd>
<p>
Stores internally the current context data (stack pointer, instruction
pointer, and CPU registers) of the current active context and restores
the context data from <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, which implies jumping to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>'s
context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
is passed to the current context to be returned by the most recent
call to <code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> in the same thread. <code class="computeroutput"><span class="identifier">fn</span></code> is executed with arguments <code class="computeroutput"><span class="identifier">args</span></code> on top of the stack of <code class="computeroutput"><span class="keyword">this</span></code>. [[Note:
</p>
<p>
The behaviour is undefined if <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code> is called while <code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> (e.g. resuming an already running
context). If the top-level context function returns, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exit</span><span class="special">()</span></code>
is called.
</p>
</dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
The tuple of void pointer argument passed to the most recent call to
<code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>,
if any and a captured_context representing the context that has been
suspended .
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h14"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
and <code class="computeroutput"><span class="identifier">other</span></code> represent
the same execution context, <code class="computeroutput"><span class="keyword">false</span></code>
otherwise.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h15"></a>
<span><a name="context.abstract_context.ccontext.code_phrase_role_keyword_operat0"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext.code_phrase_role_keyword_operat0"><code class="computeroutput"><span class="keyword">operator</span><span class="special">!=</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
[`! (other == * this)
</p></dd>
</dl>
</div>
<p>
[[Throws:] [Nothing.]] ]
</p>
<h5>
<a name="context.abstract_context.ccontext.h16"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt___phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">!=</span> <span class="identifier">other</span></code>
is true and the implementation-defined total order of <code class="computeroutput"><span class="identifier">captured_context</span></code> values places <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
before <code class="computeroutput"><span class="identifier">other</span></code>, false
otherwise.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h17"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt___phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">other</span> <span class="special">&lt;</span>
<span class="special">*</span> <span class="keyword">this</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h18"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt____phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;=</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="special">!</span> <span class="special">(</span><span class="identifier">other</span> <span class="special">&lt;</span>
<span class="special">*</span> <span class="keyword">this</span><span class="special">)</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h19"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt____phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;=</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="special">!</span> <span class="special">(*</span>
<span class="keyword">this</span> <span class="special">&lt;</span>
<span class="identifier">other</span><span class="special">)</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h20"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt__lt___phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt__lt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Efects:</span></dt>
<dd><p>
Writes the representation of <code class="computeroutput"><span class="identifier">other</span></code>
to stream <code class="computeroutput"><span class="identifier">os</span></code>.
</p></dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">os</span></code>
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.ccontext.h21"></a>
<span><a name="context.abstract_context.ccontext.struct__code__phrase_role__identifier__preallocated__phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext.struct__code__phrase_role__identifier__preallocated__phrase___code_">Struct
<code class="computeroutput"><span class="identifier">preallocated</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">preallocated</span> <span class="special">{</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">;</span>
<span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">;</span>
<span class="identifier">preallocated</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">:</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_allocator</span> <span class="identifier">sctx</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<h5>
<a name="context.abstract_context.ccontext.h22"></a>
<span><a name="context.abstract_context.ccontext._code__phrase_role__identifier__preallocated__phrase__phrase_role__special_____phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special_____phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_allocator__phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="ccontext.html#context.abstract_context.ccontext._code__phrase_role__identifier__preallocated__phrase__phrase_role__special_____phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special_____phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_allocator__phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">preallocated</span><span class="special">(</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">:</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_allocator</span> <span class="identifier">sctx</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates an object of preallocated.
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="econtext.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../abstract_context.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,737 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Class execution_context</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../abstract_context.html" title="Context classes">
<link rel="prev" href="../abstract_context.html" title="Context classes">
<link rel="next" href="ccontext.html" title="Class captured_context">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../abstract_context.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../abstract_context.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="ccontext.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="context.abstract_context.econtext"></a><a class="link" href="econtext.html" title="Class execution_context">Class execution_context</a>
</h3></div></div></div>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
<span class="emphasis"><em>execution_context</em></span> requires C++11!
</p></td></tr>
</table></div>
<p>
Class <span class="emphasis"><em>execution_context</em></span> encapsulates <span class="emphasis"><em>fcontext_t</em></span>
and manages the context' stack (allocation/deallocation).
</p>
<p>
<span class="emphasis"><em>execution_context</em></span> allocates the context stack (using
its <span class="emphasis"><em>StackAllocator</em></span> argument) and creates a control structure
on top of it. This structure controls the life time of the stack. Instances
of <span class="emphasis"><em>execution_context</em></span>, associated with a specific context,
share the ownership of the control structure. If the last reference goes
out of scope, the control structure is destroyed and the stack gets deallocated
via the <span class="emphasis"><em>StackAllocator</em></span>. <span class="emphasis"><em>execution_context</em></span>
is copy-constructible, move-constructible, copy-assignable and move-assignable.
<span class="emphasis"><em>execution_context</em></span> maintains a static, thread-local pointer
(smart pointer), accessed by <span class="emphasis"><em>execution_context::current()</em></span>,
pointing to the active context. On each context switch the static thread-local
pointer is updated. The usage of this global pointer makes the context switch
a little bit slower (due access of thread local storage) but has some advantages.
It allows to access the control structure of the current active context from
arbitrary code paths required in order to support segmented stacks, which
need to call certain maintenance functions (__splitstack_getcontext etc.)
before each context switch (each context switch exchanges the stack). Additionally
the destruction of <span class="emphasis"><em>execution_context</em></span> and thus the stack
deallocation is faster compared to <span class="emphasis"><em>captured_context</em></span>.
</p>
<p>
<span class="emphasis"><em>execution_context</em></span> expects a function/functor with signature
<code class="computeroutput"><span class="keyword">void</span><span class="special">(</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">)</span></code> (
<code class="computeroutput"><span class="identifier">vp</span></code> is the data passed at
the first invocation of <span class="emphasis"><em>execution_context::operator()</em></span>).
</p>
<h5>
<a name="context.abstract_context.econtext.h0"></a>
<span><a name="context.abstract_context.econtext.usage_of__emphasis_execution_context__emphasis_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext.usage_of__emphasis_execution_context__emphasis_">usage
of <span class="emphasis"><em>execution_context</em></span></a>
</h5>
<pre class="programlisting"><span class="comment">/*
* grammar:
* P ---&gt; E '\0'
* E ---&gt; T {('+'|'-') T}
* T ---&gt; S {('*'|'/') S}
* S ---&gt; digit | '(' E ')'
*/</span>
<span class="keyword">class</span> <span class="identifier">Parser</span><span class="special">{</span>
<span class="comment">// implementation omitted; see examples directory</span>
<span class="special">};</span>
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">istringstream</span> <span class="identifier">is</span><span class="special">(</span><span class="string">"1+1"</span><span class="special">);</span>
<span class="keyword">bool</span> <span class="identifier">done</span><span class="special">=</span><span class="keyword">false</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">except</span><span class="special">;</span>
<span class="comment">// create handle to main execution context</span>
<span class="keyword">auto</span> <span class="identifier">main_ctx</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span> <span class="special">);</span>
<span class="comment">// execute parser in new execution context</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">parser_ctx</span><span class="special">(</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg</span><span class="special">,</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">fixedsize_stack</span><span class="special">(</span><span class="number">4096</span><span class="special">),</span>
<span class="special">[&amp;</span><span class="identifier">main_ctx</span><span class="special">,&amp;</span><span class="identifier">is</span><span class="special">,&amp;</span><span class="identifier">done</span><span class="special">,&amp;</span><span class="identifier">except</span><span class="special">](</span><span class="keyword">void</span><span class="special">*){</span>
<span class="comment">// create parser with callback function</span>
<span class="identifier">Parser</span> <span class="identifier">p</span><span class="special">(</span> <span class="identifier">is</span><span class="special">,</span>
<span class="special">[&amp;</span><span class="identifier">main_ctx</span><span class="special">,&amp;</span><span class="identifier">c</span><span class="special">](</span><span class="keyword">char</span> <span class="identifier">ch</span><span class="special">){</span>
<span class="comment">// resume main execution context</span>
<span class="identifier">main_ctx</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">ch</span><span class="special">);</span>
<span class="special">});</span>
<span class="keyword">try</span> <span class="special">{</span>
<span class="comment">// start recursive parsing</span>
<span class="identifier">p</span><span class="special">.</span><span class="identifier">run</span><span class="special">();</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span> <span class="special">...</span> <span class="special">)</span> <span class="special">{</span>
<span class="comment">// store other exceptions in exception-pointer</span>
<span class="identifier">except</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">current_exception</span><span class="special">();</span>
<span class="special">}</span>
<span class="comment">// set termination flag</span>
<span class="identifier">done</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
<span class="comment">// resume main execution context</span>
<span class="identifier">main_ctx</span><span class="special">();</span>
<span class="special">});</span>
<span class="comment">// user-code pulls parsed data from parser</span>
<span class="comment">// invert control flow</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">parser_ctx</span><span class="special">();</span>
<span class="keyword">if</span> <span class="special">(</span> <span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span> <span class="identifier">except</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">while</span><span class="special">(</span> <span class="special">!</span> <span class="identifier">done</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">printf</span><span class="special">(</span><span class="string">"Parsed: %c\n"</span><span class="special">,*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">char</span><span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">vp</span><span class="special">)</span> <span class="special">);</span>
<span class="identifier">parser_ctx</span><span class="special">();</span>
<span class="keyword">if</span> <span class="special">(</span> <span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span> <span class="identifier">except</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">}</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"main: done"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="special">}</span>
<span class="identifier">output</span><span class="special">:</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="special">+</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
</pre>
<p>
In this example a recursive descent parser uses a callback to emit a newly
passed symbol. Using <span class="emphasis"><em>execution_context</em></span> the control flow
can be inverted, e.g. the user-code pulls parsed symbols from the parser
- instead to get pushed from the parser (via callback).
</p>
<p>
The data (character) is transferred between the two <span class="emphasis"><em>execution_context</em></span>.
</p>
<p>
If the code executed by <span class="emphasis"><em>execution_context</em></span> emits an exception,
the application is terminated. <span class="emphasis"><em>std::exception_ptr</em></span> can
be used to transfer exceptions between different execution contexts.
</p>
<p>
Sometimes it is necessary to unwind the stack of an unfinished context to
destroy local stack variables so they can release allocated resources (RAII
pattern). The user is responsible for this task.
</p>
<h5>
<a name="context.abstract_context.econtext.h1"></a>
<span><a name="context.abstract_context.econtext.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext.allocating_control_structures_on_top_of_stack">allocating
control structures on top of stack</a>
</h5>
<p>
Allocating control structures on top of the stack requires to allocated the
<span class="emphasis"><em>stack_context</em></span> and create the control structure with
placement new before <span class="emphasis"><em>execution_context</em></span> is created.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
The user is responsible for destructing the control structure at the top
of the stack.
</p></td></tr>
</table></div>
<pre class="programlisting"><span class="comment">// stack-allocator used for (de-)allocating stack</span>
<span class="identifier">fixedsize_stack</span> <span class="identifier">salloc</span><span class="special">(</span> <span class="number">4048</span><span class="special">);</span>
<span class="comment">// allocate stack space</span>
<span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">(</span> <span class="identifier">salloc</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">()</span> <span class="special">);</span>
<span class="comment">// reserve space for control structure on top of the stack</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">char</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span><span class="special">)</span> <span class="special">-</span> <span class="keyword">sizeof</span><span class="special">(</span> <span class="identifier">my_control_structure</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span> <span class="special">-</span> <span class="keyword">sizeof</span><span class="special">(</span> <span class="identifier">my_control_structure</span><span class="special">);</span>
<span class="comment">// placement new creates control structure on reserved space</span>
<span class="identifier">my_control_structure</span> <span class="special">*</span> <span class="identifier">cs</span> <span class="special">=</span> <span class="keyword">new</span> <span class="special">(</span> <span class="identifier">sp</span><span class="special">)</span> <span class="identifier">my_control_structure</span><span class="special">(</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">sctx</span><span class="special">,</span> <span class="identifier">salloc</span><span class="special">);</span>
<span class="special">...</span>
<span class="comment">// destructing the control structure</span>
<span class="identifier">cs</span><span class="special">-&gt;~</span><span class="identifier">my_control_structure</span><span class="special">();</span>
<span class="special">...</span>
<span class="keyword">struct</span> <span class="identifier">my_control_structure</span> <span class="special">{</span>
<span class="comment">// execution context</span>
<span class="identifier">execution_context</span> <span class="identifier">ectx</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAllocator</span> <span class="special">&gt;</span>
<span class="identifier">my_control_structure</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">,</span> <span class="identifier">StackAllocator</span> <span class="identifier">salloc</span><span class="special">)</span> <span class="special">:</span>
<span class="comment">// create execution context</span>
<span class="identifier">ectx</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg</span><span class="special">,</span> <span class="identifier">preallocated</span><span class="special">(</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">sctx</span><span class="special">),</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">entry_func</span><span class="special">)</span> <span class="special">{</span>
<span class="special">}</span>
<span class="special">...</span>
<span class="special">};</span>
</pre>
<h5>
<a name="context.abstract_context.econtext.h2"></a>
<span><a name="context.abstract_context.econtext.exception_handling"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext.exception_handling">exception
handling</a>
</h5>
<p>
If the function executed inside a <span class="emphasis"><em>execution_context</em></span>
emits ans exception, the application is terminated by calling ['std::terminate().
<span class="emphasis"><em>std::exception_ptr</em></span> can be used to transfer exceptions
between different execution contexts.
</p>
<h5>
<a name="context.abstract_context.econtext.h3"></a>
<span><a name="context.abstract_context.econtext.parameter_passing"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext.parameter_passing">parameter
passing</a>
</h5>
<p>
The void pointer argument passed to <span class="emphasis"><em>execution_context::operator()</em></span>,
in one context, is passed as the last argument of the <span class="emphasis"><em>context-function</em></span>
if the context is started for the first time. In all following invocations
of <span class="emphasis"><em>execution_context::operator()</em></span> the void pointer passed
to <span class="emphasis"><em>execution_context::operator()</em></span>, in one context, is
returned by <span class="emphasis"><em>execution_context::operator()</em></span> in the other
context.
</p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span>
<span class="keyword">private</span><span class="special">:</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">excptr_</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">caller_</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">callee_</span><span class="special">;</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="identifier">X</span><span class="special">()</span> <span class="special">:</span>
<span class="identifier">excptr_</span><span class="special">(),</span>
<span class="identifier">caller_</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span> <span class="special">),</span>
<span class="identifier">callee_</span><span class="special">(</span> <span class="special">[=]</span> <span class="special">(</span><span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">)</span> <span class="special">{</span>
<span class="keyword">try</span> <span class="special">{</span>
<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">int</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">vp</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="identifier">i</span><span class="special">);</span>
<span class="identifier">caller_</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span>
<span class="identifier">excptr_</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">current_exception</span><span class="special">();</span>
<span class="special">}</span>
<span class="special">})</span>
<span class="special">{}</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">ret</span> <span class="special">=</span> <span class="identifier">callee_</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">i</span><span class="special">);</span>
<span class="keyword">if</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">){</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">return</span> <span class="special">*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">ret</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">};</span>
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
<span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"done"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="special">}</span>
</pre>
<h5>
<a name="context.abstract_context.econtext.h4"></a>
<span><a name="context.abstract_context.econtext.class__code__phrase_role__identifier__execution_context__phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext.class__code__phrase_role__identifier__execution_context__phrase___code_">Class
<code class="computeroutput"><span class="identifier">execution_context</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">execution_context</span> <span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="keyword">static</span> <span class="identifier">execution_context</span> <span class="identifier">current</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">execution_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">execution_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
<span class="special">};</span>
</pre>
<h5>
<a name="context.abstract_context.econtext.h5"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__static__phrase___phrase_role__identifier__execution_context__phrase___phrase_role__identifier__current__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__static__phrase___phrase_role__identifier__execution_context__phrase___phrase_role__identifier__current__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">execution_context</span>
<span class="identifier">current</span><span class="special">()</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
Returns an instance of excution_context pointing to the active execution
context.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h6"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span> <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span>
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span>
<span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>. <code class="computeroutput"><span class="identifier">fixedsize_stack</span></code>
is used as default stack allocator (stack size == fixedsize_stack::traits::default_size().
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h7"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span>
<span class="special">...</span> <span class="identifier">Args</span>
<span class="special">&gt;</span> <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span>
<span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span>
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span>
<span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h8"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__preallocated__phrase___phrase_role__identifier__palloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__preallocated__phrase___phrase_role__identifier__palloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span>
<span class="special">...</span> <span class="identifier">Args</span>
<span class="special">&gt;</span> <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span>
<span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span>
<span class="identifier">salloc</span><span class="special">,</span>
<span class="identifier">Fn</span> <span class="special">&amp;&amp;</span>
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span>
<span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>. Used to store control
structures on top of the stack.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h9"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__execution_context__phrase___phrase_role__keyword__const__phrase__phrase_role__special___amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__execution_context__phrase___phrase_role__keyword__const__phrase__phrase_role__special___amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">execution_context</span><span class="special">(</span>
<span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Copies <code class="computeroutput"><span class="identifier">other</span></code>, e.g.
underlying capture record is shared with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h10"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__execution_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__execution_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">execution_context</span><span class="special">(</span>
<span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span>
<span class="identifier">other</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Moves underlying capture record to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h11"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__identifier__execution_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__execution_context__phrase___phrase_role__keyword__const__phrase__phrase_role__special___amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__identifier__execution_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__execution_context__phrase___phrase_role__keyword__const__phrase__phrase_role__special___amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">execution_context</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">=(</span>
<span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Copies the state of <code class="computeroutput"><span class="identifier">other</span></code>
to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>,
state (capture record) is shared.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h12"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__identifier__execution_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__execution_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__identifier__execution_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__execution_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">execution_context</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">=(</span>
<span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span>
<span class="identifier">other</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Moves the state of <code class="computeroutput"><span class="identifier">other</span></code>
to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
using move semantics.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h13"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__explicit__phrase___phrase_role__keyword__operator__phrase___phrase_role__keyword__bool__phrase__phrase_role__special______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__explicit__phrase___phrase_role__keyword__operator__phrase___phrase_role__keyword__bool__phrase__phrase_role__special______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
<span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
points to a capture record.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h14"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__bool__phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__bool__phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"><code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
does not point to a capture record.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h15"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__vp__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__vp__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">)</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd>
<p>
Stores internally the current context data (stack pointer, instruction
pointer, and CPU registers) of the current active context and restores
the context data from <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, which implies jumping to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>'s
context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
is passed to the current context to be returned by the most recent
call to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> in the same thread. <code class="computeroutput"><span class="identifier">fn</span></code> is executed with arguments <code class="computeroutput"><span class="identifier">args</span></code> on top of the stack of <code class="computeroutput"><span class="keyword">this</span></code>. [[Note:
</p>
<p>
The behaviour is undefined if <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code> is called while <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> (e.g. resuming an already running
context). If the top-level context function returns, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exit</span><span class="special">()</span></code>
is called.
</p>
</dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
The void pointer argument passed to the most recent call to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>,
if any.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h16"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
and <code class="computeroutput"><span class="identifier">other</span></code> represent
the same execution context, <code class="computeroutput"><span class="keyword">false</span></code>
otherwise.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h17"></a>
<span><a name="context.abstract_context.econtext.code_phrase_role_keyword_operat0"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext.code_phrase_role_keyword_operat0"><code class="computeroutput"><span class="keyword">operator</span><span class="special">!=</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
[`! (other == * this)
</p></dd>
</dl>
</div>
<p>
[[Throws:] [Nothing.]] ]
</p>
<h5>
<a name="context.abstract_context.econtext.h18"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt___phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">!=</span> <span class="identifier">other</span></code>
is true and the implementation-defined total order of <code class="computeroutput"><span class="identifier">execution_context</span></code> values places
<code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
before <code class="computeroutput"><span class="identifier">other</span></code>, false
otherwise.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h19"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt___phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">other</span> <span class="special">&lt;</span>
<span class="special">*</span> <span class="keyword">this</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h20"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt____phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;=</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="special">!</span> <span class="special">(</span><span class="identifier">other</span> <span class="special">&lt;</span>
<span class="special">*</span> <span class="keyword">this</span><span class="special">)</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h21"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt____phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;=</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="special">!</span> <span class="special">(*</span>
<span class="keyword">this</span> <span class="special">&lt;</span>
<span class="identifier">other</span><span class="special">)</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h22"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt__lt___phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt__lt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Efects:</span></dt>
<dd><p>
Writes the representation of <code class="computeroutput"><span class="identifier">other</span></code>
to stream <code class="computeroutput"><span class="identifier">os</span></code>.
</p></dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">os</span></code>
</p></dd>
</dl>
</div>
<h5>
<a name="context.abstract_context.econtext.h23"></a>
<span><a name="context.abstract_context.econtext.struct__code__phrase_role__identifier__preallocated__phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext.struct__code__phrase_role__identifier__preallocated__phrase___code_">Struct
<code class="computeroutput"><span class="identifier">preallocated</span></code></a>
</h5>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">preallocated</span> <span class="special">{</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">;</span>
<span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">;</span>
<span class="identifier">preallocated</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">:</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_allocator</span> <span class="identifier">sctx</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<h5>
<a name="context.abstract_context.econtext.h24"></a>
<span><a name="context.abstract_context.econtext._code__phrase_role__identifier__preallocated__phrase__phrase_role__special_____phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special_____phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_allocator__phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.abstract_context.econtext._code__phrase_role__identifier__preallocated__phrase__phrase_role__special_____phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special_____phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_allocator__phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">preallocated</span><span class="special">(</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">:</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_allocator</span> <span class="identifier">sctx</span><span class="special">)</span></code></a>
</h5>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates an object of preallocated.
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../abstract_context.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../abstract_context.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="ccontext.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,188 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Stack allocation</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../abstract_context.html" title="Context classes">
<link rel="prev" href="ccontext.html" title="Class captured_context">
<link rel="next" href="stack/protected_fixedsize.html" title="Class protected_fixedsize">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ccontext.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../abstract_context.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack/protected_fixedsize.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="context.abstract_context.stack"></a><a class="link" href="stack.html" title="Stack allocation">Stack allocation</a>
</h3></div></div></div>
<div class="toc"><dl>
<dt><span class="section"><a href="stack/protected_fixedsize.html">Class
<span class="emphasis"><em>protected_fixedsize</em></span></a></span></dt>
<dt><span class="section"><a href="stack/fixedsize.html">Class <span class="emphasis"><em>fixedsize_stack</em></span></a></span></dt>
<dt><span class="section"><a href="stack/segmented.html">Class <span class="emphasis"><em>segmented_stack</em></span></a></span></dt>
<dt><span class="section"><a href="stack/stack_traits.html">Class
<span class="emphasis"><em>stack_traits</em></span></a></span></dt>
<dt><span class="section"><a href="stack/stack_context.html">Class
<span class="emphasis"><em>stack_context</em></span></a></span></dt>
<dt><span class="section"><a href="stack/valgrind.html">Support for
valgrind</a></span></dt>
</dl></div>
<p>
The memory used by the stack is allocated/deallocated via a <span class="emphasis"><em>StackAllocator</em></span>
which is required to model a <span class="emphasis"><em>stack-allocator concept</em></span>.
</p>
<h5>
<a name="context.abstract_context.stack.h0"></a>
<span><a name="context.abstract_context.stack._emphasis_stack_allocator_concept__emphasis_"></a></span><a class="link" href="stack.html#context.abstract_context.stack._emphasis_stack_allocator_concept__emphasis_"><span class="emphasis"><em>stack-allocator
concept</em></span></a>
</h5>
<p>
A <span class="emphasis"><em>StackAllocator</em></span> must satisfy the <span class="emphasis"><em>stack-allocator
concept</em></span> requirements shown in the following table, in which <code class="computeroutput"><span class="identifier">a</span></code> is an object of a <span class="emphasis"><em>StackAllocator</em></span>
type, <code class="computeroutput"><span class="identifier">sctx</span></code> is a <code class="computeroutput"><span class="identifier">stack_context</span></code>, and <code class="computeroutput"><span class="identifier">size</span></code>
is a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span></code>:
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
notes
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">a</span><span class="special">(</span><span class="identifier">size</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
<td>
<p>
creates a stack allocator
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">()</span></code>
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">stack_context</span></code>
</p>
</td>
<td>
<p>
creates a stack
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">deallocate</span><span class="special">(</span>
<span class="identifier">sctx</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="keyword">void</span></code>
</p>
</td>
<td>
<p>
deallocates the stack created by <code class="computeroutput"><span class="identifier">a</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">()</span></code>
</p>
</td>
</tr>
</tbody>
</table></div>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
The implementation of <code class="computeroutput"><span class="identifier">allocate</span><span class="special">()</span></code> might include logic to protect against
exceeding the context's available stack size rather than leaving it as
undefined behaviour.
</p></td></tr>
</table></div>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
Calling <code class="computeroutput"><span class="identifier">deallocate</span><span class="special">()</span></code>
with a <code class="computeroutput"><span class="identifier">stack_context</span></code> not
set by <code class="computeroutput"><span class="identifier">allocate</span><span class="special">()</span></code>
results in undefined behaviour.
</p></td></tr>
</table></div>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
The stack is not required to be aligned; alignment takes place inside
<span class="emphasis"><em>execution_context</em></span>.
</p></td></tr>
</table></div>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
Depending on the architecture <code class="computeroutput"><span class="identifier">allocate</span><span class="special">()</span></code> stores an address from the top of the
stack (growing downwards) or the bottom of the stack (growing upwards).
</p></td></tr>
</table></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ccontext.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../abstract_context.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack/protected_fixedsize.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,113 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Class fixedsize_stack</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../stack.html" title="Stack allocation">
<link rel="prev" href="protected_fixedsize.html" title="Class protected_fixedsize">
<link rel="next" href="segmented.html" title="Class segmented_stack">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="protected_fixedsize.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="segmented.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="context.abstract_context.stack.fixedsize"></a><a class="link" href="fixedsize.html" title="Class fixedsize_stack">Class <span class="emphasis"><em>fixedsize_stack</em></span></a>
</h4></div></div></div>
<p>
<span class="bold"><strong>Boost.Context</strong></span> provides the class <span class="emphasis"><em>fixedsize_stack</em></span>
which models the <span class="emphasis"><em>stack-allocator concept</em></span>. In contrast
to <span class="emphasis"><em>protected_fixedsize_stack</em></span> it does not append a
guard page at the end of each stack. The memory is simply managed by <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">malloc</span><span class="special">()</span></code>
and <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">free</span><span class="special">()</span></code>.
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">context</span><span class="special">/</span><span class="identifier">fixedsize_stack</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">basic_fixedsize_stack</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">traitT</span> <span class="identifier">traits_type</span><span class="special">;</span>
<span class="identifier">basic_fixesize_stack</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">default_size</span><span class="special">());</span>
<span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
<span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;);</span>
<span class="special">}</span>
<span class="keyword">typedef</span> <span class="identifier">basic_fixedsize_stack</span><span class="special">&lt;</span> <span class="identifier">stack_traits</span> <span class="special">&gt;</span> <span class="identifier">fixedsize_stack</span><span class="special">;</span>
</pre>
<h6>
<a name="context.abstract_context.stack.fixedsize.h0"></a>
<span><a name="context.abstract_context.stack.fixedsize._code__phrase_role__identifier__stack_context__phrase___phrase_role__identifier__allocate__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="fixedsize.html#context.abstract_context.stack.fixedsize._code__phrase_role__identifier__stack_context__phrase___phrase_role__identifier__allocate__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">()</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Preconditions:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span>
<span class="special">&lt;=</span> <span class="identifier">size</span></code>
and <code class="computeroutput"><span class="special">!</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
<span class="special">(</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span>
<span class="identifier">size</span><span class="special">)</span></code>.
</p></dd>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Allocates memory of at least <code class="computeroutput"><span class="identifier">size</span></code>
Bytes and stores a pointer to the stack and its actual size in <code class="computeroutput"><span class="identifier">sctx</span></code>. Depending on the architecture
(the stack grows downwards/upwards) the stored address is the highest/lowest
address of the stack.
</p></dd>
</dl>
</div>
<h6>
<a name="context.abstract_context.stack.fixedsize.h1"></a>
<span><a name="context.abstract_context.stack.fixedsize._code__phrase_role__keyword__void__phrase___phrase_role__identifier__deallocate__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_context__phrase___phrase_role__special___amp___phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="fixedsize.html#context.abstract_context.stack.fixedsize._code__phrase_role__keyword__void__phrase___phrase_role__identifier__deallocate__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_context__phrase___phrase_role__special___amp___phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span>
<span class="special">&amp;</span> <span class="identifier">sctx</span><span class="special">)</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Preconditions:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span></code> is valid, <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;=</span>
<span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span></code> and <code class="computeroutput"><span class="special">!</span>
<span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span>
<span class="special">&amp;&amp;</span> <span class="special">(</span>
<span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span>
<span class="special">&gt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span><span class="special">)</span></code>.
</p></dd>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Deallocates the stack space.
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="protected_fixedsize.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="segmented.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,136 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Class protected_fixedsize</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../stack.html" title="Stack allocation">
<link rel="prev" href="../stack.html" title="Stack allocation">
<link rel="next" href="fixedsize.html" title="Class fixedsize_stack">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../stack.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="fixedsize.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="context.abstract_context.stack.protected_fixedsize"></a><a class="link" href="protected_fixedsize.html" title="Class protected_fixedsize">Class
<span class="emphasis"><em>protected_fixedsize</em></span></a>
</h4></div></div></div>
<p>
<span class="bold"><strong>Boost.Context</strong></span> provides the class <span class="emphasis"><em>protected_fixedsize_stack</em></span>
which models the <span class="emphasis"><em>stack-allocator concept</em></span>. It appends
a guard page at the end of each stack to protect against exceeding the
stack. If the guard page is accessed (read or write operation) a segmentation
fault/access violation is generated by the operating system.
</p>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
Using <span class="emphasis"><em>protected_fixedsize_stack</em></span> is expensive. That
is, launching a new coroutine with a new stack is expensive; the allocated
stack is just as efficient to use as any other stack.
</p></td></tr>
</table></div>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
The appended <code class="computeroutput"><span class="identifier">guard</span> <span class="identifier">page</span></code>
is <span class="bold"><strong>not</strong></span> mapped to physical memory, only
virtual addresses are used.
</p></td></tr>
</table></div>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">context</span><span class="special">/</span><span class="identifier">protected_fixedsize</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">basic_protected_fixedsize</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">traitT</span> <span class="identifier">traits_type</span><span class="special">;</span>
<span class="identifier">basic_protected_fixesize</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">default_size</span><span class="special">());</span>
<span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
<span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;);</span>
<span class="special">}</span>
<span class="keyword">typedef</span> <span class="identifier">basic_protected_fixedsize</span><span class="special">&lt;</span> <span class="identifier">stack_traits</span> <span class="special">&gt;</span> <span class="identifier">protected_fixedsize</span>
</pre>
<h6>
<a name="context.abstract_context.stack.protected_fixedsize.h0"></a>
<span><a name="context.abstract_context.stack.protected_fixedsize._code__phrase_role__identifier__stack_context__phrase___phrase_role__identifier__allocate__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="protected_fixedsize.html#context.abstract_context.stack.protected_fixedsize._code__phrase_role__identifier__stack_context__phrase___phrase_role__identifier__allocate__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">()</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Preconditions:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span>
<span class="special">&lt;=</span> <span class="identifier">size</span></code>
and <code class="computeroutput"><span class="special">!</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
<span class="special">(</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span>
<span class="identifier">size</span><span class="special">)</span></code>.
</p></dd>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Allocates memory of at least <code class="computeroutput"><span class="identifier">size</span></code>
Bytes and stores a pointer to the stack and its actual size in <code class="computeroutput"><span class="identifier">sctx</span></code>. Depending on the architecture
(the stack grows downwards/upwards) the stored address is the highest/lowest
address of the stack.
</p></dd>
</dl>
</div>
<h6>
<a name="context.abstract_context.stack.protected_fixedsize.h1"></a>
<span><a name="context.abstract_context.stack.protected_fixedsize._code__phrase_role__keyword__void__phrase___phrase_role__identifier__deallocate__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_context__phrase___phrase_role__special___amp___phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="protected_fixedsize.html#context.abstract_context.stack.protected_fixedsize._code__phrase_role__keyword__void__phrase___phrase_role__identifier__deallocate__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_context__phrase___phrase_role__special___amp___phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span>
<span class="special">&amp;</span> <span class="identifier">sctx</span><span class="special">)</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Preconditions:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span></code> is valid, <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;=</span>
<span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span></code> and <code class="computeroutput"><span class="special">!</span>
<span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span>
<span class="special">&amp;&amp;</span> <span class="special">(</span>
<span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span>
<span class="special">&gt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span><span class="special">)</span></code>.
</p></dd>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Deallocates the stack space.
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../stack.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="fixedsize.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,139 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Class segmented_stack</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../stack.html" title="Stack allocation">
<link rel="prev" href="fixedsize.html" title="Class fixedsize_stack">
<link rel="next" href="stack_traits.html" title="Class stack_traits">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="fixedsize.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack_traits.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="context.abstract_context.stack.segmented"></a><a class="link" href="segmented.html" title="Class segmented_stack">Class <span class="emphasis"><em>segmented_stack</em></span></a>
</h4></div></div></div>
<p>
<span class="bold"><strong>Boost.Context</strong></span> supports usage of a <span class="emphasis"><em>segmented_stack</em></span>,
e. g. the size of the stack grows on demand. The coroutine is created with
a minimal stack size and will be increased as required. Class <span class="emphasis"><em>segmented_stack</em></span>
models the <span class="emphasis"><em>stack-allocator concept</em></span>. In contrast to
<span class="emphasis"><em>protected_fixedsize_stack</em></span> and <span class="emphasis"><em>fixedsize_stack</em></span>
it creates a stack which grows on demand.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
Segmented stacks are currently only supported by <span class="bold"><strong>gcc</strong></span>
from version <span class="bold"><strong>4.7</strong></span> <span class="bold"><strong>clang</strong></span>
from version <span class="bold"><strong>3.4</strong></span> onwards. In order to
use a __segmented_stack__ <span class="bold"><strong>Boost.Context</strong></span>
must be built with <span class="bold"><strong>toolset=gcc segmented-stacks=on</strong></span>
at b2/bjam command-line. Applications must be compiled with compiler-flags
<span class="bold"><strong>-fsplit-stack -DBOOST_USE_SEGMENTED_STACKS</strong></span>.
</p></td></tr>
</table></div>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">context</span><span class="special">/</span><span class="identifier">segmented_stack</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">basic_segmented_stack</span>
<span class="special">{</span>
<span class="keyword">typedef</span> <span class="identifier">traitT</span> <span class="identifier">traits_type</span><span class="special">;</span>
<span class="identifier">basic_segmented_stack</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">default_size</span><span class="special">());</span>
<span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">();</span>
<span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span> <span class="special">&amp;);</span>
<span class="special">}</span>
<span class="keyword">typedef</span> <span class="identifier">basic_segmented_stack</span><span class="special">&lt;</span> <span class="identifier">stack_traits</span> <span class="special">&gt;</span> <span class="identifier">segmented_stack</span><span class="special">;</span>
</pre>
<h6>
<a name="context.abstract_context.stack.segmented.h0"></a>
<span><a name="context.abstract_context.stack.segmented._code__phrase_role__identifier__stack_context__phrase___phrase_role__identifier__allocate__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="segmented.html#context.abstract_context.stack.segmented._code__phrase_role__identifier__stack_context__phrase___phrase_role__identifier__allocate__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="identifier">stack_context</span> <span class="identifier">allocate</span><span class="special">()</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Preconditions:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span>
<span class="special">&lt;=</span> <span class="identifier">size</span></code>
and <code class="computeroutput"><span class="special">!</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span> <span class="special">&amp;&amp;</span>
<span class="special">(</span> <span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&gt;=</span>
<span class="identifier">size</span><span class="special">)</span></code>.
</p></dd>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Allocates memory of at least <code class="computeroutput"><span class="identifier">size</span></code>
Bytes and stores a pointer to the stack and its actual size in <code class="computeroutput"><span class="identifier">sctx</span></code>. Depending on the architecture
(the stack grows downwards/upwards) the stored address is the highest/lowest
address of the stack.
</p></dd>
</dl>
</div>
<h6>
<a name="context.abstract_context.stack.segmented.h1"></a>
<span><a name="context.abstract_context.stack.segmented._code__phrase_role__keyword__void__phrase___phrase_role__identifier__deallocate__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_context__phrase___phrase_role__special___amp___phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="segmented.html#context.abstract_context.stack.segmented._code__phrase_role__keyword__void__phrase___phrase_role__identifier__deallocate__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_context__phrase___phrase_role__special___amp___phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">void</span> <span class="identifier">deallocate</span><span class="special">(</span> <span class="identifier">stack_context</span>
<span class="special">&amp;</span> <span class="identifier">sctx</span><span class="special">)</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Preconditions:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span></code> is valid, <code class="computeroutput"><span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">minimum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span> <span class="special">&lt;=</span>
<span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span></code> and <code class="computeroutput"><span class="special">!</span>
<span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">is_unbounded</span><span class="special">()</span>
<span class="special">&amp;&amp;</span> <span class="special">(</span>
<span class="identifier">traits_type</span><span class="special">::</span><span class="identifier">maximum</span><span class="special">:</span><span class="identifier">size</span><span class="special">()</span>
<span class="special">&gt;=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span><span class="special">)</span></code>.
</p></dd>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Deallocates the stack space.
</p></dd>
</dl>
</div>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
If the library is compiled for segmented stacks, __segmented_stack__
is the only available stack allocator.
</p></td></tr>
</table></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="fixedsize.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack_traits.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,85 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Class stack_context</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../stack.html" title="Stack allocation">
<link rel="prev" href="stack_traits.html" title="Class stack_traits">
<link rel="next" href="valgrind.html" title="Support for valgrind">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack_traits.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="valgrind.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="context.abstract_context.stack.stack_context"></a><a class="link" href="stack_context.html" title="Class stack_context">Class
<span class="emphasis"><em>stack_context</em></span></a>
</h4></div></div></div>
<p>
<span class="bold"><strong>Boost.Context</strong></span> provides the class <span class="emphasis"><em>stack_context</em></span>
which will contain the stack pointer and the size of the stack. In case
of a <span class="emphasis"><em>segmented_stack</em></span>, <span class="emphasis"><em>stack_context</em></span>
contains some extra control structures.
</p>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">stack_context</span>
<span class="special">{</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">;</span>
<span class="comment">// might contain additional control structures</span>
<span class="comment">// for segmented stacks</span>
<span class="special">}</span>
</pre>
<h6>
<a name="context.abstract_context.stack.stack_context.h0"></a>
<span><a name="context.abstract_context.stack.stack_context._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__sp__phrase___code_"></a></span><a class="link" href="stack_context.html#context.abstract_context.stack.stack_context._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__sp__phrase___code_"><code class="computeroutput"><span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Value:</span></dt>
<dd><p>
Pointer to the beginning of the stack.
</p></dd>
</dl>
</div>
<h6>
<a name="context.abstract_context.stack.stack_context.h1"></a>
<span><a name="context.abstract_context.stack.stack_context._code__phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase___code_"></a></span><a class="link" href="stack_context.html#context.abstract_context.stack.stack_context._code__phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase___code_"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Value:</span></dt>
<dd><p>
Actual size of the stack.
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack_traits.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="valgrind.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,159 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Class stack_traits</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../stack.html" title="Stack allocation">
<link rel="prev" href="segmented.html" title="Class segmented_stack">
<link rel="next" href="stack_context.html" title="Class stack_context">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="segmented.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack_context.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="context.abstract_context.stack.stack_traits"></a><a class="link" href="stack_traits.html" title="Class stack_traits">Class
<span class="emphasis"><em>stack_traits</em></span></a>
</h4></div></div></div>
<p>
<span class="emphasis"><em>stack_traits</em></span> models a <span class="emphasis"><em>stack-traits</em></span>
providing a way to access certain properites defined by the enironment.
Stack allocators use <span class="emphasis"><em>stack-traits</em></span> to allocate stacks.
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">context</span><span class="special">/</span><span class="identifier">stack_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">stack_traits</span>
<span class="special">{</span>
<span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">is_unbounded</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">page_size</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">default_size</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">minimum_size</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">maximum_size</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="special">}</span>
</pre>
<h6>
<a name="context.abstract_context.stack.stack_traits.h0"></a>
<span><a name="context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__keyword__bool__phrase___phrase_role__identifier__is_unbounded__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="stack_traits.html#context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__keyword__bool__phrase___phrase_role__identifier__is_unbounded__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">static</span> <span class="keyword">bool</span> <span class="identifier">is_unbounded</span><span class="special">()</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
Returns <code class="computeroutput"><span class="keyword">true</span></code> if the
environment defines no limit for the size of a stack.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h6>
<a name="context.abstract_context.stack.stack_traits.h1"></a>
<span><a name="context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__page_size__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="stack_traits.html#context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__page_size__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">page_size</span><span class="special">()</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
Returns the page size in bytes.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h6>
<a name="context.abstract_context.stack.stack_traits.h2"></a>
<span><a name="context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__default_size__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="stack_traits.html#context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__default_size__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">default_size</span><span class="special">()</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
Returns a default stack size, which may be platform specific. If
the stack is unbounded then the present implementation returns the
maximum of <code class="computeroutput"><span class="number">64</span> <span class="identifier">kB</span></code>
and <code class="computeroutput"><span class="identifier">minimum_size</span><span class="special">()</span></code>.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h6>
<a name="context.abstract_context.stack.stack_traits.h3"></a>
<span><a name="context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__minimum_size__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="stack_traits.html#context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__minimum_size__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">minimum_size</span><span class="special">()</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
Returns the minimum size in bytes of stack defined by the environment
(Win32 4kB/Win64 8kB, defined by rlimit on POSIX).
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h6>
<a name="context.abstract_context.stack.stack_traits.h4"></a>
<span><a name="context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__maximum_size__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="stack_traits.html#context.abstract_context.stack.stack_traits._code__phrase_role__keyword__static__phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__maximum_size__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">maximum_size</span><span class="special">()</span></code></a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Preconditions:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">is_unbounded</span><span class="special">()</span></code>
returns <code class="computeroutput"><span class="keyword">false</span></code>.
</p></dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
Returns the maximum size in bytes of stack defined by the environment.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="segmented.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack_context.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,49 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Support for valgrind</title>
<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../stack.html" title="Stack allocation">
<link rel="prev" href="stack_context.html" title="Class stack_context">
<link rel="next" href="../../performance.html" title="Performance">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack_context.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../performance.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="context.abstract_context.stack.valgrind"></a><a class="link" href="valgrind.html" title="Support for valgrind">Support for
valgrind</a>
</h4></div></div></div>
<p>
Running programs that switch stacks under valgrind causes problems. Property
(b2 command-line) <code class="computeroutput"><span class="identifier">valgrind</span><span class="special">=</span><span class="identifier">on</span></code> let
valgrind treat the memory regions as stack space which suppresses the errors.
</p>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack_context.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../performance.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,707 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Class captured_context</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="prev" href="econtext.html" title="Class execution_context">
<link rel="next" href="stack.html" title="Stack allocation">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
<td align="center"><a href="../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="econtext.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="context.ccontext"></a><a name="ccontext"></a><a class="link" href="ccontext.html" title="Class captured_context">Class captured_context</a>
</h2></div></div></div>
<p>
Class <span class="emphasis"><em>captured_context</em></span> encapsulates <span class="emphasis"><em>fcontext_t</em></span>
and manages the context' stack (allocation/deallocation).
</p>
<p>
<span class="emphasis"><em>captured_context</em></span> allocates the context stack (using its
<span class="emphasis"><em>StackAllocator</em></span> argument) and creates a control structure
on top of it. This structure controls the life time of the stack. The address
of the control structure is stored in the first frame of context' stack (e.g.
it can not accessed by instances of <span class="emphasis"><em>captured_context</em></span> directly).
In contrast to <span class="emphasis"><em>execution_context</em></span> the ownership of the
control structure is not shared A call of<span class="emphasis"><em>captured_context::operator()</em></span>
enters the context represented by <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and invalidates <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. The context that has been suspended by
calling <span class="emphasis"><em>captured_context::operator()</em></span> is passed to the
resumed context, e.g. as argument of the context-function if the context was
resumed the first time or returned by <span class="emphasis"><em>captured_context::operator()</em></span>.
<span class="emphasis"><em>captured_context</em></span> is only move-constructible and move-assignable.
If the last reference (<span class="emphasis"><em>captured_context</em></span>) goes out of scope,
the control structure is destroyed and the stack gets deallocated via the
<span class="emphasis"><em>StackAllocator</em></span>. <span class="emphasis"><em>captured_context</em></span>
maintains a static, thread-local pointer (smart pointer), accessed by <span class="emphasis"><em>execution_context::current()</em></span>,
pointing to the active context. On each context switch the static, thread-local
pointer is updated. This makes the context switch a little bit slower, but
enables faster context destruction (stack unwinding) compared to <span class="emphasis"><em>captured_context</em></span>.
</p>
<p>
<span class="emphasis"><em>captured_context</em></span> expects a function/functor with signature
<code class="computeroutput"><span class="identifier">captured_context</span><span class="special">(</span>
<span class="identifier">captured_context</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span>
<span class="identifier">vp</span><span class="special">)</span></code>.
The parameter <code class="computeroutput"><span class="identifier">ctx</span></code> represents
the context from which this context was resumed (e.g. that has called <span class="emphasis"><em>captured_context::operator()</em></span>
on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>)
and <code class="computeroutput"><span class="identifier">vp</span></code> is the data passed to
<span class="emphasis"><em>captured_context::operator()</em></span>. The function/functor has
to return the captured_context that has to be resumed, while this context terminates.
</p>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
Segemnted stacks are not supported together with <span class="emphasis"><em>captured_context</em></span>.
</p></td></tr>
</table></div>
<h4>
<a name="context.ccontext.h0"></a>
<span><a name="context.ccontext.usage_of__emphasis_captured_context__emphasis_"></a></span><a class="link" href="ccontext.html#context.ccontext.usage_of__emphasis_captured_context__emphasis_">usage
of <span class="emphasis"><em>captured_context</em></span></a>
</h4>
<pre class="programlisting"><span class="comment">/*
* grammar:
* P ---&gt; E '\0'
* E ---&gt; T {('+'|'-') T}
* T ---&gt; S {('*'|'/') S}
* S ---&gt; digit | '(' E ')'
*/</span>
<span class="keyword">class</span> <span class="identifier">Parser</span><span class="special">{</span>
<span class="comment">// implementation omitted; see examples directory</span>
<span class="special">};</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">istringstream</span> <span class="identifier">is</span><span class="special">(</span><span class="string">"1+1"</span><span class="special">);</span>
<span class="keyword">bool</span> <span class="identifier">done</span><span class="special">=</span><span class="keyword">false</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">except</span><span class="special">;</span>
<span class="comment">// execute parser in new execution context</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">captured_context</span> <span class="identifier">pctx</span><span class="special">(</span>
<span class="special">[&amp;</span><span class="identifier">is</span><span class="special">,&amp;</span><span class="identifier">done</span><span class="special">,&amp;</span><span class="identifier">except</span><span class="special">](</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">captured_context</span> <span class="identifier">mctx</span><span class="special">,</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">ignored</span><span class="special">){</span>
<span class="comment">// create parser with callback function</span>
<span class="identifier">Parser</span> <span class="identifier">p</span><span class="special">(</span> <span class="identifier">is</span><span class="special">,</span>
<span class="special">[&amp;</span><span class="identifier">mctx</span><span class="special">](</span><span class="keyword">char</span> <span class="identifier">ch</span><span class="special">){</span>
<span class="comment">// resume main execution context</span>
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">mctx</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">ch</span><span class="special">);</span>
<span class="identifier">mctx</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
<span class="special">});</span>
<span class="keyword">try</span> <span class="special">{</span>
<span class="comment">// start recursive parsing</span>
<span class="identifier">p</span><span class="special">.</span><span class="identifier">run</span><span class="special">();</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span> <span class="special">...</span> <span class="special">)</span> <span class="special">{</span>
<span class="comment">// store other exceptions in exception-pointer</span>
<span class="identifier">except</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">current_exception</span><span class="special">();</span>
<span class="special">}</span>
<span class="comment">// set termination flag</span>
<span class="identifier">done</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span>
<span class="comment">// resume main execution context</span>
<span class="keyword">return</span> <span class="identifier">mctx</span><span class="special">;</span>
<span class="special">});</span>
<span class="comment">// user-code pulls parsed data from parser</span>
<span class="comment">// invert control flow</span>
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">pctx</span><span class="special">();</span>
<span class="identifier">pctx</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">);</span>
<span class="keyword">if</span> <span class="special">(</span> <span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span> <span class="identifier">except</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">while</span><span class="special">(</span> <span class="special">!</span> <span class="identifier">done</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">printf</span><span class="special">(</span><span class="string">"Parsed: %c\n"</span><span class="special">,*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">char</span><span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">vp</span><span class="special">)</span> <span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tie</span><span class="special">(</span><span class="identifier">pctx</span><span class="special">,</span><span class="identifier">vp</span><span class="special">)</span> <span class="special">=</span> <span class="identifier">pctx</span><span class="special">();</span>
<span class="keyword">if</span> <span class="special">(</span> <span class="identifier">except</span><span class="special">)</span> <span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span> <span class="identifier">except</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">}</span>
<span class="identifier">output</span><span class="special">:</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="special">+</span>
<span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span>
</pre>
<p>
In this example a recursive descent parser uses a callback to emit a newly
passed symbol. Using <span class="emphasis"><em>captured_context</em></span> the control flow
can be inverted, e.g. the user-code pulls parsed symbols from the parser -
instead to get pushed from the parser (via callback).
</p>
<p>
The data (character) is transferred between the two <span class="emphasis"><em>captured_context</em></span>.
</p>
<p>
If the code executed by <span class="emphasis"><em>captured_context</em></span> emits an exception,
the application is terminated. <span class="emphasis"><em>std::exception_ptr</em></span> can
be used to transfer exceptions between different execution contexts.
</p>
<p>
Sometimes it is necessary to unwind the stack of an unfinished context to destroy
local stack variables so they can release allocated resources (RAII pattern).
The user is responsible for this task.
</p>
<h4>
<a name="context.ccontext.h1"></a>
<span><a name="context.ccontext.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="ccontext.html#context.ccontext.allocating_control_structures_on_top_of_stack">allocating
control structures on top of stack</a>
</h4>
<p>
Allocating control structures on top of the stack requires to allocated the
<span class="emphasis"><em>stack_context</em></span> and create the control structure with placement
new before <span class="emphasis"><em>captured_context</em></span> is created.
</p>
<div class="note"><table border="0" summary="Note">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
<th align="left">Note</th>
</tr>
<tr><td align="left" valign="top"><p>
The user is responsible for destructing the control structure at the top
of the stack.
</p></td></tr>
</table></div>
<pre class="programlisting"><span class="comment">// stack-allocator used for (de-)allocating stack</span>
<span class="identifier">fixedsize_stack</span> <span class="identifier">salloc</span><span class="special">(</span> <span class="number">4048</span><span class="special">);</span>
<span class="comment">// allocate stack space</span>
<span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">(</span> <span class="identifier">salloc</span><span class="special">.</span><span class="identifier">allocate</span><span class="special">()</span> <span class="special">);</span>
<span class="comment">// reserve space for control structure on top of the stack</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">char</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">sp</span><span class="special">)</span> <span class="special">-</span> <span class="keyword">sizeof</span><span class="special">(</span> <span class="identifier">my_control_structure</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span> <span class="special">=</span> <span class="identifier">sctx</span><span class="special">.</span><span class="identifier">size</span> <span class="special">-</span> <span class="keyword">sizeof</span><span class="special">(</span> <span class="identifier">my_control_structure</span><span class="special">);</span>
<span class="comment">// placement new creates control structure on reserved space</span>
<span class="identifier">my_control_structure</span> <span class="special">*</span> <span class="identifier">cs</span> <span class="special">=</span> <span class="keyword">new</span> <span class="special">(</span> <span class="identifier">sp</span><span class="special">)</span> <span class="identifier">my_control_structure</span><span class="special">(</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">sctx</span><span class="special">,</span> <span class="identifier">salloc</span><span class="special">);</span>
<span class="special">...</span>
<span class="comment">// destructing the control structure</span>
<span class="identifier">cs</span><span class="special">-&gt;~</span><span class="identifier">my_control_structure</span><span class="special">();</span>
<span class="special">...</span>
<span class="keyword">struct</span> <span class="identifier">my_control_structure</span> <span class="special">{</span>
<span class="comment">// captured context</span>
<span class="identifier">captured_context</span> <span class="identifier">cctx</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAllocator</span> <span class="special">&gt;</span>
<span class="identifier">my_control_structure</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">,</span> <span class="identifier">StackAllocator</span> <span class="identifier">salloc</span><span class="special">)</span> <span class="special">:</span>
<span class="comment">// create captured context</span>
<span class="identifier">cctx</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg</span><span class="special">,</span> <span class="identifier">preallocated</span><span class="special">(</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">sctx</span><span class="special">),</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">entry_func</span><span class="special">)</span> <span class="special">{</span>
<span class="special">}</span>
<span class="special">...</span>
<span class="special">};</span>
</pre>
<h4>
<a name="context.ccontext.h2"></a>
<span><a name="context.ccontext.exception_handling"></a></span><a class="link" href="ccontext.html#context.ccontext.exception_handling">exception
handling</a>
</h4>
<p>
If the function executed inside a <span class="emphasis"><em>captured_context</em></span> emits
ans exception, the application is terminated by calling ['std::terminate().
<span class="emphasis"><em>std::exception_ptr</em></span> can be used to transfer exceptions
between different execution contexts.
</p>
<h4>
<a name="context.ccontext.h3"></a>
<span><a name="context.ccontext.parameter_passing"></a></span><a class="link" href="ccontext.html#context.ccontext.parameter_passing">parameter
passing</a>
</h4>
<p>
The void pointer argument passed to <span class="emphasis"><em>captured_context::operator()</em></span>,
in one context, is passed as the last argument of the <span class="emphasis"><em>context-function</em></span>
if the context is started for the first time. In all following invocations
of <span class="emphasis"><em>captured_context::operator()</em></span> the void pointer passed
to <span class="emphasis"><em>captured_context::operator()</em></span>, in one context, is returned
by <span class="emphasis"><em>captured_context::operator()</em></span> in the other context.
</p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span>
<span class="keyword">private</span><span class="special">:</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">excptr_</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">captured_context</span> <span class="identifier">ctx_</span><span class="special">;</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="identifier">X</span><span class="special">()</span> <span class="special">:</span>
<span class="identifier">excptr_</span><span class="special">(),</span>
<span class="identifier">ctx_</span><span class="special">(</span> <span class="special">[=](</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">captured_context</span> <span class="identifier">ctx</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">)-&gt;</span><span class="identifier">ctx</span><span class="special">::</span><span class="identifier">captured_context</span><span class="special">{</span>
<span class="keyword">try</span> <span class="special">{</span>
<span class="keyword">for</span> <span class="special">(;;)</span> <span class="special">{</span>
<span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="special">*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="keyword">int</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">vp</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">str</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">&gt;(</span><span class="identifier">i</span><span class="special">);</span>
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">ctx</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">str</span><span class="special">);</span>
<span class="identifier">ctx</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
<span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span> <span class="identifier">ctx</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">forced_unwind</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">{</span>
<span class="keyword">throw</span><span class="special">;</span>
<span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span>
<span class="identifier">excptr_</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">current_exception</span><span class="special">();</span>
<span class="special">}</span>
<span class="keyword">return</span> <span class="identifier">ctx</span><span class="special">;</span>
<span class="special">})</span>
<span class="special">{}</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
<span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">ctx_</span><span class="special">(</span> <span class="special">&amp;</span> <span class="identifier">i</span><span class="special">);</span>
<span class="identifier">ctx_</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">);</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">ret</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special">&lt;</span><span class="number">1</span><span class="special">&gt;(</span> <span class="identifier">result</span><span class="special">);</span>
<span class="keyword">if</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">){</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">rethrow_exception</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">return</span> <span class="special">*</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">*</span> <span class="special">&gt;(</span> <span class="identifier">ret</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">};</span>
<span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">output</span><span class="special">:</span>
<span class="number">7</span>
</pre>
<h4>
<a name="context.ccontext.h4"></a>
<span><a name="context.ccontext.class__code__phrase_role__identifier__captured_context__phrase___code_"></a></span><a class="link" href="ccontext.html#context.ccontext.class__code__phrase_role__identifier__captured_context__phrase___code_">Class
<code class="computeroutput"><span class="identifier">captured_context</span></code></a>
</h4>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">captured_context</span> <span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="special">~</span><span class="identifier">captured_context</span><span class="special">();</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">captured_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">captured_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
<span class="identifier">captured_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
<span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
<span class="special">};</span>
</pre>
<p>
</p>
<h5>
<a name="captured_context_constructor_bridgehead"></a>
<span><a name="captured_context_constructor"></a></span>
<a class="link" href="ccontext.html#captured_context_constructor">Constructor</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>. <code class="computeroutput"><span class="identifier">fixedsize_stack</span></code>
is used as default stack allocator (stack size == fixedsize_stack::traits::default_size().
</p></dd>
</dl>
</div>
<p>
[[Effects:] [Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>.]] ] [[Effects:] [Creates
a new execution context and prepares the context to execute <code class="computeroutput"><span class="identifier">fn</span></code>.
Used to store control structures on top of the stack.]] ]
</p>
<p>
</p>
<h5>
<a name="captured_context_move%20constructor_bridgehead"></a>
<span><a name="captured_context_move%20constructor"></a></span>
<a class="link" href="ccontext.html#captured_context_move%20constructor">Move constructor</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">captured_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Moves underlying capture record to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_move%20assignment_bridgehead"></a>
<span><a name="captured_context_move%20assignment"></a></span>
<a class="link" href="ccontext.html#captured_context_move%20assignment">Move assignment operator</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="identifier">captured_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Moves the state of <code class="computeroutput"><span class="identifier">other</span></code>
to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
using move semantics.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_bool_bridgehead"></a>
<span><a name="captured_context_operator_bool"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_bool">Member
function <code class="computeroutput">operator bool</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> points to a capture record.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_not_bridgehead"></a>
<span><a name="captured_context_operator_not"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_not">Member
function <code class="computeroutput">operator!</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> does not point to a capture record.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_call_bridgehead"></a>
<span><a name="captured_context_operator_call"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_call">Member
function <code class="computeroutput">operator()</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</span> <span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd>
<p>
Stores internally the current context data (stack pointer, instruction
pointer, and CPU registers) of the current active context and restores
the context data from <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, which implies jumping to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>'s
context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
is passed to the current context to be returned by the most recent call
to <code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>
in the same thread. <code class="computeroutput"><span class="identifier">fn</span></code>
is executed with arguments <code class="computeroutput"><span class="identifier">args</span></code>
on top of the stack of <code class="computeroutput"><span class="keyword">this</span></code>.
[[Note:
</p>
<p>
The behaviour is undefined if <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code> is called while <code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> (e.g. resuming an already running
context). If the top-level context function returns, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exit</span><span class="special">()</span></code> is called.
</p>
</dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
The tuple of void pointer argument passed to the most recent call to
<code class="computeroutput"><span class="identifier">captured_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>,
if any and a captured_context representing the context that has been
suspended .
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_equal_bridgehead"></a>
<span><a name="captured_context_operator_equal"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_equal">Member
function <code class="computeroutput">operator==</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> and <code class="computeroutput"><span class="identifier">other</span></code>
represent the same execution context, <code class="computeroutput"><span class="keyword">false</span></code>
otherwise.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_notequal_bridgehead"></a>
<span><a name="captured_context_operator_notequal"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_notequal">Member
function <code class="computeroutput">operator!=</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput">! (other == * this)</code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_less_bridgehead"></a>
<span><a name="captured_context_operator_less"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_less">Member
function <code class="computeroutput">operator&lt;</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span> <span class="special">!=</span> <span class="identifier">other</span></code> is true and the implementation-defined
total order of <code class="computeroutput"><span class="identifier">captured_context</span></code>
values places <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
before <code class="computeroutput"><span class="identifier">other</span></code>, false otherwise.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_greater_bridgehead"></a>
<span><a name="captured_context_operator_greater"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_greater">Member
function <code class="computeroutput">operator&gt;</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">other</span> <span class="special">&lt;</span>
<span class="special">*</span> <span class="keyword">this</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_lesseq_bridgehead"></a>
<span><a name="captured_context_operator_lesseq"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_lesseq">Member
function <code class="computeroutput">operator&lt;=</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="special">!</span> <span class="special">(</span><span class="identifier">other</span> <span class="special">&lt;</span>
<span class="special">*</span> <span class="keyword">this</span><span class="special">)</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_operator_greatereq_bridgehead"></a>
<span><a name="captured_context_operator_greatereq"></a></span>
<a class="link" href="ccontext.html#captured_context_operator_greatereq">Member
function <code class="computeroutput">operator&gt;=</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="special">!</span> <span class="special">(*</span>
<span class="keyword">this</span> <span class="special">&lt;</span>
<span class="identifier">other</span><span class="special">)</span></code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
</p>
<h5>
<a name="captured_context_bridgehead"></a>
<span><a name="captured_context"></a></span>
<a class="link" href="ccontext.html#captured_context">Non-member function
<code class="computeroutput">operator&lt;&lt;()</code></a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Efects:</span></dt>
<dd><p>
Writes the representation of <code class="computeroutput"><span class="identifier">other</span></code>
to stream <code class="computeroutput"><span class="identifier">os</span></code>.
</p></dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
<code class="computeroutput"><span class="identifier">os</span></code>
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="econtext.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -7,7 +7,7 @@
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="prev" href="requirements.html" title="Requirements">
<link rel="next" href="econtext.html" title="Class execution_context">
<link rel="next" href="abstract_context.html" title="Context classes">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="econtext.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="abstract_context.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -71,7 +71,7 @@
</h4>
<p>
A new context supposed to execute a <span class="emphasis"><em>context-function</em></span> (returning
void and accepting intptr_t as argument) will be created on top of the stack
void and accepting void * as argument) will be created on top of the stack
(at 16 byte boundary) by function <span class="emphasis"><em>make_fcontext()</em></span>.
</p>
<pre class="programlisting"><span class="comment">// context-function</span>
@@ -98,7 +98,7 @@
</p>
<pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">fcontext_t</span> <span class="identifier">fcm</span><span class="special">,</span><span class="identifier">fc1</span><span class="special">,</span><span class="identifier">fc2</span><span class="special">;</span>
<span class="keyword">void</span> <span class="identifier">f1</span><span class="special">(</span><span class="identifier">intptr_t</span><span class="special">)</span>
<span class="keyword">void</span> <span class="identifier">f1</span><span class="special">(</span><span class="keyword">void</span> <span class="special">*)</span>
<span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="string">"f1: entered"</span><span class="special">&lt;&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="string">"f1: call jump_fcontext( &amp; fc1, fc2, 0)"</span><span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
@@ -107,7 +107,7 @@
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fc1</span><span class="special">,</span><span class="identifier">fcm</span><span class="special">,</span><span class="number">0</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">void</span> <span class="identifier">f2</span><span class="special">(</span><span class="identifier">intptr_t</span><span class="special">)</span>
<span class="keyword">void</span> <span class="identifier">f2</span><span class="special">(</span><span class="keyword">void</span> <span class="special">*)</span>
<span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="string">"f2: entered"</span><span class="special">&lt;&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="string">"f2: call jump_fcontext( &amp; fc2, fc1, 0)"</span><span class="special">&lt;&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
@@ -180,7 +180,7 @@
The third argument passed to <span class="emphasis"><em>jump_fcontext()</em></span>, in one context,
is passed as the first argument of the <span class="emphasis"><em>context-function</em></span>
if the context is started for the first time. In all following invocations
of <span class="emphasis"><em>jump_fcontext()</em></span> the intptr_t passed to <span class="emphasis"><em>jump_fcontext()</em></span>,
of <span class="emphasis"><em>jump_fcontext()</em></span> the void * passed to <span class="emphasis"><em>jump_fcontext()</em></span>,
in one context, is returned by <span class="emphasis"><em>jump_fcontext()</em></span> in the
other context.
</p>
@@ -188,11 +188,11 @@
<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">pair_t</span><span class="special">;</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">intptr_t</span> <span class="identifier">param</span><span class="special">)</span>
<span class="keyword">void</span> <span class="identifier">f</span><span class="special">(</span><span class="keyword">void</span> <span class="special">*</span> <span class="identifier">param</span><span class="special">)</span>
<span class="special">{</span>
<span class="identifier">pair_t</span><span class="special">*</span> <span class="identifier">p</span><span class="special">=(</span><span class="identifier">pair_t</span><span class="special">*)</span><span class="identifier">param</span><span class="special">;</span>
<span class="identifier">p</span><span class="special">=(</span><span class="identifier">pair_t</span><span class="special">*)</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fc</span><span class="special">,</span><span class="identifier">fcm</span><span class="special">,(</span><span class="identifier">intptr_t</span><span class="special">)(</span><span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">first</span><span class="special">+</span><span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">second</span><span class="special">));</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fc</span><span class="special">,</span><span class="identifier">fcm</span><span class="special">,(</span><span class="identifier">intptr_t</span><span class="special">)(</span><span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">first</span><span class="special">+</span><span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">second</span><span class="special">));</span>
<span class="identifier">p</span><span class="special">=(</span><span class="identifier">pair_t</span><span class="special">*)</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fc</span><span class="special">,</span><span class="identifier">fcm</span><span class="special">,(</span><span class="keyword">void</span> <span class="special">*)(</span><span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">first</span><span class="special">+</span><span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">second</span><span class="special">));</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fc</span><span class="special">,</span><span class="identifier">fcm</span><span class="special">,(</span><span class="keyword">void</span> <span class="special">*)(</span><span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">first</span><span class="special">+</span><span class="identifier">p</span><span class="special">-&gt;</span><span class="identifier">second</span><span class="special">));</span>
<span class="special">}</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">(</span><span class="number">8192</span><span class="special">);</span>
@@ -201,11 +201,11 @@
<span class="identifier">pair_t</span> <span class="identifier">p</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="number">2</span><span class="special">,</span><span class="number">7</span><span class="special">));</span>
<span class="identifier">fc</span><span class="special">=</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">make_fcontext</span><span class="special">(</span><span class="identifier">sp</span><span class="special">,</span><span class="identifier">size</span><span class="special">,</span><span class="identifier">f</span><span class="special">);</span>
<span class="keyword">int</span> <span class="identifier">res</span><span class="special">=(</span><span class="keyword">int</span><span class="special">)</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fcm</span><span class="special">,</span><span class="identifier">fc</span><span class="special">,(</span><span class="identifier">intptr_t</span><span class="special">)&amp;</span><span class="identifier">p</span><span class="special">);</span>
<span class="keyword">int</span> <span class="identifier">res</span><span class="special">=(</span><span class="keyword">int</span><span class="special">)</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fcm</span><span class="special">,</span><span class="identifier">fc</span><span class="special">,(</span><span class="keyword">void</span> <span class="special">*)&amp;</span><span class="identifier">p</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">first</span><span class="special">&lt;&lt;</span><span class="string">" + "</span><span class="special">&lt;&lt;</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span><span class="special">&lt;&lt;</span><span class="string">" == "</span><span class="special">&lt;&lt;</span><span class="identifier">res</span><span class="special">&lt;&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">p</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="number">5</span><span class="special">,</span><span class="number">6</span><span class="special">);</span>
<span class="identifier">res</span><span class="special">=(</span><span class="keyword">int</span><span class="special">)</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fcm</span><span class="special">,</span><span class="identifier">fc</span><span class="special">,(</span><span class="identifier">intptr_t</span><span class="special">)&amp;</span><span class="identifier">p</span><span class="special">);</span>
<span class="identifier">res</span><span class="special">=(</span><span class="keyword">int</span><span class="special">)</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">jump_fcontext</span><span class="special">(&amp;</span><span class="identifier">fcm</span><span class="special">,</span><span class="identifier">fc</span><span class="special">,(</span><span class="keyword">void</span> <span class="special">*)&amp;</span><span class="identifier">p</span><span class="special">);</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">first</span><span class="special">&lt;&lt;</span><span class="string">" + "</span><span class="special">&lt;&lt;</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span><span class="special">&lt;&lt;</span><span class="string">" == "</span><span class="special">&lt;&lt;</span><span class="identifier">res</span><span class="special">&lt;&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">output</span><span class="special">:</span>
@@ -243,26 +243,6 @@
</table></div>
<h4>
<a name="context.context.h3"></a>
<span><a name="context.context.preserving_floating_point_registers"></a></span><a class="link" href="context.html#context.context.preserving_floating_point_registers">Preserving
floating point registers</a>
</h4>
<p>
Preserving the floating point registers increases the cycle count for a context
switch (see performance tests). The fourth argument of <span class="emphasis"><em>jump_fcontext()</em></span>
controls if fpu registers should be preserved by the context jump.
</p>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
The use of the fpu controlling argument of <span class="emphasis"><em>jump_fcontext()</em></span>
must be consistent in the application. Otherwise the behaviour is undefined.
</p></td></tr>
</table></div>
<h4>
<a name="context.context.h4"></a>
<span><a name="context.context.stack_unwinding"></a></span><a class="link" href="context.html#context.context.stack_unwinding">Stack
unwinding</a>
</h4>
@@ -272,7 +252,7 @@
The user is responsible for this task.
</p>
<h4>
<a name="context.context.h5"></a>
<a name="context.context.h4"></a>
<span><a name="context.context._code__phrase_role__identifier__fcontext_t__phrase___code__and_related_functions"></a></span><a class="link" href="context.html#context.context._code__phrase_role__identifier__fcontext_t__phrase___code__and_related_functions"><code class="computeroutput"><span class="identifier">fcontext_t</span></code> and related functions</a>
</h4>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">stack_t</span>
@@ -283,11 +263,11 @@
<span class="keyword">typedef</span> <span class="special">&lt;</span><span class="identifier">opaque</span> <span class="identifier">pointer</span> <span class="special">&gt;</span> <span class="identifier">fcontext_t</span><span class="special">;</span>
<span class="identifier">intptr_t</span> <span class="identifier">jump_fcontext</span><span class="special">(</span><span class="identifier">fcontext_t</span><span class="special">*</span> <span class="identifier">ofc</span><span class="special">,</span><span class="identifier">fcontext_t</span> <span class="identifier">nfc</span><span class="special">,</span><span class="identifier">intptr_t</span> <span class="identifier">vp</span><span class="special">,</span><span class="keyword">bool</span> <span class="identifier">preserve_fpu</span><span class="special">=</span><span class="keyword">true</span><span class="special">);</span>
<span class="identifier">fcontext_t</span> <span class="identifier">make_fcontext</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span><span class="keyword">void</span><span class="special">(*</span><span class="identifier">fn</span><span class="special">)(</span><span class="identifier">intptr_t</span><span class="special">));</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">jump_fcontext</span><span class="special">(</span><span class="identifier">fcontext_t</span><span class="special">*</span> <span class="identifier">ofc</span><span class="special">,</span><span class="identifier">fcontext_t</span> <span class="identifier">nfc</span><span class="special">,</span><span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">);</span>
<span class="identifier">fcontext_t</span> <span class="identifier">make_fcontext</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span><span class="keyword">void</span><span class="special">(*</span><span class="identifier">fn</span><span class="special">)(</span><span class="keyword">void</span> <span class="special">*));</span>
</pre>
<h4>
<a name="context.context.h6"></a>
<a name="context.context.h5"></a>
<span><a name="context.context._code__phrase_role__identifier__sp__phrase___code_"></a></span><a class="link" href="context.html#context.context._code__phrase_role__identifier__sp__phrase___code_"><code class="computeroutput"><span class="identifier">sp</span></code></a>
</h4>
<div class="variablelist">
@@ -301,7 +281,7 @@
</dl>
</div>
<h4>
<a name="context.context.h7"></a>
<a name="context.context.h6"></a>
<span><a name="context.context._code__phrase_role__identifier__size__phrase___code_"></a></span><a class="link" href="context.html#context.context._code__phrase_role__identifier__size__phrase___code_"><code class="computeroutput"><span class="identifier">size</span></code></a>
</h4>
<div class="variablelist">
@@ -314,7 +294,7 @@
</dl>
</div>
<h4>
<a name="context.context.h8"></a>
<a name="context.context.h7"></a>
<span><a name="context.context._code__phrase_role__identifier__fc_stack__phrase___code_"></a></span><a class="link" href="context.html#context.context._code__phrase_role__identifier__fc_stack__phrase___code_"><code class="computeroutput"><span class="identifier">fc_stack</span></code></a>
</h4>
<div class="variablelist">
@@ -327,9 +307,9 @@
</dl>
</div>
<h4>
<a name="context.context.h9"></a>
<span><a name="context.context._code__phrase_role__identifier__intptr_t__phrase___phrase_role__identifier__jump_fcontext__phrase__phrase_role__special_____phrase__phrase_role__identifier__fcontext_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__ofc__phrase__phrase_role__special_____phrase__phrase_role__identifier__fcontext_t__phrase___phrase_role__identifier__nfc__phrase__phrase_role__special_____phrase__phrase_role__identifier__intptr_t__phrase___phrase_role__identifier__p__phrase__phrase_role__special_____phrase__phrase_role__keyword__bool__phrase___phrase_role__identifier__preserve_fpu__phrase__phrase_role__special_____phrase__phrase_role__keyword__true__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="context.html#context.context._code__phrase_role__identifier__intptr_t__phrase___phrase_role__identifier__jump_fcontext__phrase__phrase_role__special_____phrase__phrase_role__identifier__fcontext_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__ofc__phrase__phrase_role__special_____phrase__phrase_role__identifier__fcontext_t__phrase___phrase_role__identifier__nfc__phrase__phrase_role__special_____phrase__phrase_role__identifier__intptr_t__phrase___phrase_role__identifier__p__phrase__phrase_role__special_____phrase__phrase_role__keyword__bool__phrase___phrase_role__identifier__preserve_fpu__phrase__phrase_role__special_____phrase__phrase_role__keyword__true__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">intptr_t</span> <span class="identifier">jump_fcontext</span><span class="special">(</span><span class="identifier">fcontext_t</span><span class="special">*</span> <span class="identifier">ofc</span><span class="special">,</span><span class="identifier">fcontext_t</span> <span class="identifier">nfc</span><span class="special">,</span><span class="identifier">intptr_t</span> <span class="identifier">p</span><span class="special">,</span><span class="keyword">bool</span>
<span class="identifier">preserve_fpu</span><span class="special">=</span><span class="keyword">true</span><span class="special">)</span></code></a>
<a name="context.context.h8"></a>
<span><a name="context.context._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__jump_fcontext__phrase__phrase_role__special_____phrase__phrase_role__identifier__fcontext_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__ofc__phrase__phrase_role__special_____phrase__phrase_role__identifier__fcontext_t__phrase___phrase_role__identifier__nfc__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__p__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="context.html#context.context._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__jump_fcontext__phrase__phrase_role__special_____phrase__phrase_role__identifier__fcontext_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__ofc__phrase__phrase_role__special_____phrase__phrase_role__identifier__fcontext_t__phrase___phrase_role__identifier__nfc__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__p__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">void</span> <span class="special">*</span> <span class="identifier">jump_fcontext</span><span class="special">(</span><span class="identifier">fcontext_t</span><span class="special">*</span> <span class="identifier">ofc</span><span class="special">,</span><span class="identifier">fcontext_t</span> <span class="identifier">nfc</span><span class="special">,</span><span class="keyword">void</span> <span class="special">*</span>
<span class="identifier">p</span><span class="special">)</span></code></a>
</h4>
<div class="variablelist">
<p class="title"><b></b></p>
@@ -339,12 +319,11 @@
Stores the current context data (stack pointer, instruction pointer,
and CPU registers) to <code class="computeroutput"><span class="special">*</span><span class="identifier">ofc</span></code> and restores the context data from
<code class="computeroutput"><span class="identifier">nfc</span></code>, which implies jumping
to <code class="computeroutput"><span class="identifier">nfc</span></code>'s execution context.
The intptr_t argument, <code class="computeroutput"><span class="identifier">p</span></code>,
to execution context <code class="computeroutput"><span class="identifier">nfc</span></code>.
The void * argument, <code class="computeroutput"><span class="identifier">p</span></code>,
is passed to the current context to be returned by the most recent call
to <code class="computeroutput"><span class="identifier">jump_fcontext</span><span class="special">()</span></code>
in the same thread. The last argument controls if fpu registers have
to be preserved.
in the same thread.
</p></dd>
<dt><span class="term">Returns:</span></dt>
<dd><p>
@@ -354,10 +333,10 @@
</dl>
</div>
<h4>
<a name="context.context.h10"></a>
<span><a name="context.context._code__phrase_role__identifier__fcontext_t__phrase___phrase_role__identifier__make_fcontext__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase__phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase__phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase__phrase_role__special______phrase__phrase_role__identifier__fn__phrase__phrase_role__special______phrase__phrase_role__identifier__intptr_t__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="context.html#context.context._code__phrase_role__identifier__fcontext_t__phrase___phrase_role__identifier__make_fcontext__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase__phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase__phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase__phrase_role__special______phrase__phrase_role__identifier__fn__phrase__phrase_role__special______phrase__phrase_role__identifier__intptr_t__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="identifier">fcontext_t</span> <span class="identifier">make_fcontext</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span>
<a name="context.context.h9"></a>
<span><a name="context.context._code__phrase_role__identifier__fcontext_t__phrase___phrase_role__identifier__make_fcontext__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase__phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase__phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase__phrase_role__special______phrase__phrase_role__identifier__fn__phrase__phrase_role__special______phrase__phrase_role__keyword__void__phrase___phrase_role__special_______phrase___code_"></a></span><a class="link" href="context.html#context.context._code__phrase_role__identifier__fcontext_t__phrase___phrase_role__identifier__make_fcontext__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase__phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase__phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase__phrase_role__keyword__void__phrase__phrase_role__special______phrase__phrase_role__identifier__fn__phrase__phrase_role__special______phrase__phrase_role__keyword__void__phrase___phrase_role__special_______phrase___code_"><code class="computeroutput"><span class="identifier">fcontext_t</span> <span class="identifier">make_fcontext</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span>
<span class="identifier">sp</span><span class="special">,</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span>
<span class="identifier">size</span><span class="special">,</span><span class="keyword">void</span><span class="special">(*</span><span class="identifier">fn</span><span class="special">)(</span><span class="identifier">intptr_t</span><span class="special">))</span></code></a>
<span class="identifier">size</span><span class="special">,</span><span class="keyword">void</span><span class="special">(*</span><span class="identifier">fn</span><span class="special">)(</span><span class="keyword">void</span> <span class="special">*))</span></code></a>
</h4>
<div class="variablelist">
<p class="title"><b></b></p>
@@ -392,7 +371,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="econtext.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="abstract_context.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -6,8 +6,8 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="prev" href="context.html" title="Struct fcontext_t">
<link rel="next" href="econtext/winfibers.html" title="Using WinFiber-API">
<link rel="prev" href="requirements.html" title="Requirements">
<link rel="next" href="ccontext.html" title="Class captured_context">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,28 +20,79 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="context.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="econtext/winfibers.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="ccontext.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="context.econtext"></a><a class="link" href="econtext.html" title="Class execution_context">Class execution_context</a>
<a name="context.econtext"></a><a name="econtext"></a><a class="link" href="econtext.html" title="Class execution_context">Class execution_context</a>
</h2></div></div></div>
<div class="toc"><dl><dt><span class="section"><a href="econtext/winfibers.html">Using WinFiber-API</a></span></dt></dl></div>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
<span class="emphasis"><em>execution_context</em></span> requires C++14.
</p></td></tr>
</table></div>
<p>
Class <span class="emphasis"><em>execution_context</em></span> encapsulates <span class="emphasis"><em>fcontext_t</em></span>
and related functions ( <span class="emphasis"><em>jump_fcontext()</em></span> and <span class="emphasis"><em>make_fcontext()</em></span>)
as well as stack management. <span class="emphasis"><em>execution_context</em></span> permits
access to the current, active context via <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span></code>.
and manages the context' stack (allocation/deallocation).
</p>
<p>
<span class="emphasis"><em>execution_context</em></span> allocates the context stack (using its
<a class="link" href="stack.html#stack"><span class="emphasis"><em>StackAllocator</em></span></a> argument)
and creates a control structure on top of it. This structure controls the life
time of the stack. Instances of <span class="emphasis"><em>execution_context</em></span>, associated
with a specific context, share the ownership of the control structure. If the
last reference goes out of scope, the control structure is destroyed and the
stack gets deallocated via the <span class="emphasis"><em>StackAllocator</em></span>.
</p>
<p>
<span class="emphasis"><em>execution_context</em></span> is copy-constructible, move-constructible,
copy-assignable and move-assignable.
</p>
<p>
<span class="emphasis"><em>execution_context</em></span> maintains a static, thread-local pointer
(smart pointer), accessed by <span class="emphasis"><em>execution_context::current()</em></span>,
pointing to the active context. On each context switch the static thread-local
pointer is updated. The usage of this global pointer makes the context switch
a little bit slower (due access of thread local storage) but has some advantages.
It allows to access the control structure of the current active context from
arbitrary code paths required in order to support segmented stacks, which need
to call certain maintenance functions (__splitstack_getcontext() etc.) before
each context switch (each context switch exchanges the stack). Additionally
the destruction of <span class="emphasis"><em>execution_context</em></span> and thus the stack
deallocation is faster compared to <a class="link" href="ccontext.html#ccontext"><span class="emphasis"><em>captured_context</em></span></a>.
</p>
<p>
<span class="emphasis"><em>execution_context</em></span> expects a function/functor with signature
<code class="computeroutput"><span class="keyword">void</span><span class="special">(</span><span class="keyword">void</span><span class="special">*</span> <span class="identifier">vp</span><span class="special">)</span></code> ( <code class="computeroutput"><span class="identifier">vp</span></code>
is the data passed at the first invocation of <a class="link" href="econtext.html#execution_context_operator_call"> <code class="computeroutput">execution_context::operator()()</code></a>).
</p>
<h4>
<a name="context.econtext.h0"></a>
<span><a name="context.econtext.usage_of__emphasis_execution_context__emphasis_"></a></span><a class="link" href="econtext.html#context.econtext.usage_of__emphasis_execution_context__emphasis_">usage
of <span class="emphasis"><em>execution_context</em></span></a>
</h4>
<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">n</span><span class="special">=</span><span class="number">35</span><span class="special">;</span>
<span class="keyword">int</span> <span class="identifier">p</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">mctx</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span> <span class="special">);</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">ctx</span><span class="special">(</span>
<span class="special">[</span><span class="identifier">n</span><span class="special">,&amp;</span><span class="identifier">p</span><span class="special">,&amp;</span><span class="identifier">mctx</span><span class="special">](</span><span class="keyword">void</span><span class="special">*)</span><span class="keyword">mutable</span><span class="special">{</span>
<span class="keyword">int</span> <span class="identifier">a</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
<span class="keyword">int</span> <span class="identifier">b</span><span class="special">=</span><span class="number">1</span><span class="special">;</span>
<span class="keyword">while</span><span class="special">(</span><span class="identifier">n</span><span class="special">--&gt;</span><span class="number">0</span><span class="special">){</span>
<span class="identifier">yield</span><span class="special">(</span><span class="identifier">a</span><span class="special">);</span>
<span class="keyword">auto</span> <span class="identifier">next</span><span class="special">=</span><span class="identifier">a</span><span class="special">+</span><span class="identifier">b</span><span class="special">;</span>
<span class="identifier">a</span><span class="special">=</span><span class="identifier">b</span><span class="special">;</span>
<span class="identifier">b</span><span class="special">=</span><span class="identifier">next</span><span class="special">;</span>
<span class="special">}</span>
<span class="special">});</span>
<span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">=</span><span class="number">0</span><span class="special">;</span><span class="identifier">i</span><span class="special">&lt;</span><span class="number">10</span><span class="special">;++</span><span class="identifier">i</span><span class="special">){</span>
<span class="identifier">ctx</span><span class="special">();</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special">&lt;&lt;</span><span class="identifier">p</span><span class="special">&lt;&lt;</span><span class="string">" "</span><span class="special">;</span>
<span class="special">}</span>
<span class="identifier">output</span><span class="special">:</span>
<span class="number">0</span> <span class="number">1</span> <span class="number">1</span> <span class="number">2</span> <span class="number">3</span> <span class="number">5</span> <span class="number">8</span> <span class="number">13</span> <span class="number">21</span> <span class="number">34</span>
</pre>
<h4>
<a name="context.econtext.h1"></a>
<span><a name="context.econtext.inverting_the_control_flow"></a></span><a class="link" href="econtext.html#context.econtext.inverting_the_control_flow">inverting
the control flow</a>
</h4>
<pre class="programlisting"><span class="comment">/*
* grammar:
* P ---&gt; E '\0'
@@ -127,7 +178,7 @@
The user is responsible for this task.
</p>
<h4>
<a name="context.econtext.h0"></a>
<a name="context.econtext.h2"></a>
<span><a name="context.econtext.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="econtext.html#context.econtext.allocating_control_structures_on_top_of_stack">allocating
control structures on top of stack</a>
</h4>
@@ -172,7 +223,7 @@
<span class="special">};</span>
</pre>
<h4>
<a name="context.econtext.h1"></a>
<a name="context.econtext.h3"></a>
<span><a name="context.econtext.exception_handling"></a></span><a class="link" href="econtext.html#context.econtext.exception_handling">exception
handling</a>
</h4>
@@ -183,7 +234,7 @@
between different execution contexts.
</p>
<h4>
<a name="context.econtext.h2"></a>
<a name="context.econtext.h4"></a>
<span><a name="context.econtext.parameter_passing"></a></span><a class="link" href="econtext.html#context.econtext.parameter_passing">parameter
passing</a>
</h4>
@@ -225,14 +276,14 @@
<span class="special">}</span>
<span class="special">};</span>
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> <span class="special">{</span>
<span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"done"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="special">}</span>
<span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">output</span><span class="special">:</span>
<span class="number">7</span>
</pre>
<h4>
<a name="context.econtext.h3"></a>
<a name="context.econtext.h5"></a>
<span><a name="context.econtext.class__code__phrase_role__identifier__execution_context__phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext.class__code__phrase_role__identifier__execution_context__phrase___code_">Class
<code class="computeroutput"><span class="identifier">execution_context</span></code></a>
</h4>
@@ -258,7 +309,13 @@
<span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
@@ -277,11 +334,18 @@
<span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
<span class="special">};</span>
</pre>
<h4>
<a name="context.econtext.h4"></a>
<span><a name="context.econtext._code__phrase_role__keyword__static__phrase___phrase_role__identifier__execution_context__phrase___phrase_role__identifier__current__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__static__phrase___phrase_role__identifier__execution_context__phrase___phrase_role__identifier__current__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">static</span> <span class="identifier">execution_context</span>
<span class="identifier">current</span><span class="special">()</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_current_bridgehead"></a>
<span><a name="execution_context_current"></a></span>
<a class="link" href="econtext.html#execution_context_current">Static
member function <code class="computeroutput">current</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">static</span> <span class="identifier">execution_context</span> <span class="identifier">current</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -296,12 +360,24 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h5"></a>
<span><a name="context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span> <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span>
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span>
<span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_constructor_bridgehead"></a>
<span><a name="execution_context_constructor"></a></span>
<a class="link" href="econtext.html#execution_context_constructor">Constructor</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span> <span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -313,50 +389,22 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h6"></a>
<span><a name="context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span>
<span class="special">...</span> <span class="identifier">Args</span>
<span class="special">&gt;</span> <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span>
<span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span>
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span>
<span class="special">...</span> <span class="identifier">args</span><span class="special">)</span></code></a>
</h4>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>.
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h7"></a>
<span><a name="context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__preallocated__phrase___phrase_role__identifier__palloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__template__phrase__phrase_role__special___lt___phrase___phrase_role__keyword__typename__phrase___phrase_role__identifier__stackalloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__typname__phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__keyword__typename__phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase___phrase_role__special___gt___phrase___phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special______phrase__phrase_role__identifier__allocator_arg_t__phrase__phrase_role__special_____phrase___phrase_role__identifier__preallocated__phrase___phrase_role__identifier__palloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__stackalloc__phrase___phrase_role__identifier__salloc__phrase__phrase_role__special_____phrase___phrase_role__identifier__fn__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__fn__phrase__phrase_role__special_____phrase___phrase_role__identifier__args__phrase___phrase_role__special___amp__amp___phrase___phrase_role__special_______phrase___phrase_role__identifier__args__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">StackAlloc</span><span class="special">,</span> <span class="identifier">typname</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span>
<span class="special">...</span> <span class="identifier">Args</span>
<span class="special">&gt;</span> <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator_arg_t</span><span class="special">,</span>
<span class="identifier">preallocated</span> <span class="identifier">palloc</span><span class="special">,</span> <span class="identifier">StackAlloc</span> <span class="identifier">salloc</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span>
<span class="special">&amp;&amp;</span> <span class="special">...</span>
<span class="identifier">args</span><span class="special">)</span></code></a>
</h4>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>. Used to store control
structures on top of the stack.
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h8"></a>
<span><a name="context.econtext._code__phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__execution_context__phrase___phrase_role__keyword__const__phrase__phrase_role__special___amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__execution_context__phrase___phrase_role__keyword__const__phrase__phrase_role__special___amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">execution_context</span><span class="special">(</span>
<span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span></code></a>
</h4>
<p>
[[Effects:] [Creates a new execution context and prepares the context to execute
<code class="computeroutput"><span class="identifier">fn</span></code>. Used to store control structures
on top of the stack.]] ]
</p>
<p>
</p>
<h5>
<a name="execution_context_copy%20constructor_bridgehead"></a>
<span><a name="execution_context_copy%20constructor"></a></span>
<a class="link" href="econtext.html#execution_context_copy%20constructor">Copy constructor</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -371,12 +419,17 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h9"></a>
<span><a name="context.econtext._code__phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__execution_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__identifier__execution_context__phrase__phrase_role__special_____phrase___phrase_role__identifier__execution_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">execution_context</span><span class="special">(</span>
<span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span>
<span class="identifier">other</span><span class="special">)</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_move%20constructor_bridgehead"></a>
<span><a name="execution_context_move%20constructor"></a></span>
<a class="link" href="econtext.html#execution_context_move%20constructor">Move constructor</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -390,12 +443,17 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h10"></a>
<span><a name="context.econtext._code__phrase_role__identifier__execution_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__execution_context__phrase___phrase_role__keyword__const__phrase__phrase_role__special___amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__identifier__execution_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__execution_context__phrase___phrase_role__keyword__const__phrase__phrase_role__special___amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">execution_context</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">=(</span>
<span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_copy%20assignment_bridgehead"></a>
<span><a name="execution_context_copy%20assignment"></a></span>
<a class="link" href="econtext.html#execution_context_copy%20assignment">Copy assignment operator</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="identifier">execution_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -411,13 +469,17 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h11"></a>
<span><a name="context.econtext._code__phrase_role__identifier__execution_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__execution_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__identifier__execution_context__phrase___phrase_role__special___amp___phrase___phrase_role__keyword__operator__phrase__phrase_role__special______phrase___phrase_role__identifier__execution_context__phrase___phrase_role__special___amp__amp___phrase___phrase_role__identifier__other__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">execution_context</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">=(</span>
<span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span>
<span class="identifier">other</span><span class="special">)</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_move%20assignment_bridgehead"></a>
<span><a name="execution_context_move%20assignment"></a></span>
<a class="link" href="econtext.html#execution_context_move%20assignment">Move assignment operator</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="identifier">execution_context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="special">&amp;&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -433,11 +495,18 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h12"></a>
<span><a name="context.econtext._code__phrase_role__keyword__explicit__phrase___phrase_role__keyword__operator__phrase___phrase_role__keyword__bool__phrase__phrase_role__special______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__explicit__phrase___phrase_role__keyword__operator__phrase___phrase_role__keyword__bool__phrase__phrase_role__special______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"><code class="computeroutput"><span class="keyword">explicit</span> <span class="keyword">operator</span>
<span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_operator_bool_bridgehead"></a>
<span><a name="execution_context_operator_bool"></a></span>
<a class="link" href="econtext.html#execution_context_operator_bool">Member
function <code class="computeroutput">operator bool</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="keyword">bool</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -451,10 +520,18 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h13"></a>
<span><a name="context.econtext._code__phrase_role__keyword__bool__phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__bool__phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__const__phrase___phrase_role__keyword__noexcept__phrase___code_"><code class="computeroutput"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_operator_not_bridgehead"></a>
<span><a name="execution_context_operator_not"></a></span>
<a class="link" href="econtext.html#execution_context_operator_not">Member
function <code class="computeroutput">operator!</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -468,11 +545,24 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h14"></a>
<span><a name="context.econtext._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__vp__phrase__phrase_role__special_____phrase___phrase_role__keyword__noexcept__phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__keyword__operator__phrase__phrase_role__special_______phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__vp__phrase__phrase_role__special_____phrase___phrase_role__keyword__noexcept__phrase___code_"><code class="computeroutput"><span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span>
<span class="identifier">vp</span><span class="special">)</span> <span class="keyword">noexcept</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_operator_call_bridgehead"></a>
<span><a name="execution_context_operator_call"></a></span>
<a class="link" href="econtext.html#execution_context_operator_call">Member
function <code class="computeroutput">operator()</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Fn</span><span class="special">,</span> <span class="keyword">typename</span> <span class="special">...</span> <span class="identifier">Args</span> <span class="special">&gt;</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">data</span><span class="special">,</span> <span class="identifier">exec_ontop_arg_t</span><span class="special">,</span> <span class="identifier">Fn</span> <span class="special">&amp;&amp;</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&amp;&amp;</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
@@ -480,11 +570,14 @@
<dd>
<p>
Stores internally the current context data (stack pointer, instruction
pointer, and CPU registers) to the current active context and restores
pointer, and CPU registers) of the current active context and restores
the context data from <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, which implies jumping to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>'s
execution context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>,
is passed to the current context to be returned by the most recent call
to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> in the same thread. [[Note:
to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code> in the same thread. <code class="computeroutput"><span class="identifier">fn</span></code>
is executed with arguments <code class="computeroutput"><span class="identifier">args</span></code>
on top of the stack of <code class="computeroutput"><span class="keyword">this</span></code>.
[[Note:
</p>
<p>
The behaviour is undefined if <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code> is called while <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">()</span></code> returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> (e.g. resuming an already running
@@ -496,16 +589,18 @@
The void pointer argument passed to the most recent call to <code class="computeroutput"><span class="identifier">execution_context</span><span class="special">::</span><span class="keyword">operator</span><span class="special">()</span></code>,
if any.
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h15"></a>
<span><a name="context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special______phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special______phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">==</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_operator_equal_bridgehead"></a>
<span><a name="execution_context_operator_equal"></a></span>
<a class="link" href="econtext.html#execution_context_operator_equal">Member
function <code class="computeroutput">operator==</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
@@ -523,10 +618,16 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h16"></a>
<span><a name="context.econtext.code_phrase_role_keyword_operat0"></a></span><a class="link" href="econtext.html#context.econtext.code_phrase_role_keyword_operat0"><code class="computeroutput"><span class="keyword">operator</span><span class="special">!=</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_operator_notequal_bridgehead"></a>
<span><a name="execution_context_operator_notequal"></a></span>
<a class="link" href="econtext.html#execution_context_operator_notequal">Member
function <code class="computeroutput">operator!=</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">!=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
@@ -534,17 +635,24 @@
<dl>
<dt><span class="term">Returns:</span></dt>
<dd><p>
[`! (other == * this)
<code class="computeroutput">! (other == * this)</code>
</p></dd>
<dt><span class="term">Throws:</span></dt>
<dd><p>
Nothing.
</p></dd>
</dl>
</div>
<p>
[[Throws:] [Nothing.]] ]
</p>
<h5>
<a name="execution_context_operator_less_bridgehead"></a>
<span><a name="execution_context_operator_less"></a></span>
<a class="link" href="econtext.html#execution_context_operator_less">Member
function <code class="computeroutput">operator&lt;</code>()</a>
</h5>
<p>
</p>
<h4>
<a name="context.econtext.h17"></a>
<span><a name="context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt___phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;</span></code></a>
</h4>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
@@ -563,10 +671,16 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h18"></a>
<span><a name="context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt___phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_operator_greater_bridgehead"></a>
<span><a name="execution_context_operator_greater"></a></span>
<a class="link" href="econtext.html#execution_context_operator_greater">Member
function <code class="computeroutput">operator&gt;</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
@@ -583,10 +697,16 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h19"></a>
<span><a name="context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt____phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;=</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_operator_lesseq_bridgehead"></a>
<span><a name="execution_context_operator_lesseq"></a></span>
<a class="link" href="econtext.html#execution_context_operator_lesseq">Member
function <code class="computeroutput">operator&lt;=</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
@@ -603,10 +723,16 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h20"></a>
<span><a name="context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___gt____phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;=</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_operator_greatereq_bridgehead"></a>
<span><a name="execution_context_operator_greatereq"></a></span>
<a class="link" href="econtext.html#execution_context_operator_greatereq">Member
function <code class="computeroutput">operator&gt;=</code>()</a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
@@ -624,10 +750,16 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h21"></a>
<span><a name="context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt__lt___phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__keyword__operator__phrase__phrase_role__special___lt__lt___phrase___code_"><code class="computeroutput"><span class="keyword">operator</span><span class="special">&lt;&lt;</span></code></a>
</h4>
<p>
</p>
<h5>
<a name="execution_context_bridgehead"></a>
<span><a name="execution_context"></a></span>
<a class="link" href="econtext.html#execution_context">Non-member function
<code class="computeroutput">operator&lt;&lt;()</code></a>
</h5>
<p>
</p>
<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">charT</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span>
<span class="keyword">operator</span><span class="special">&lt;&lt;(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special">&lt;</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">&gt;</span> <span class="special">&amp;</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">);</span>
@@ -646,33 +778,6 @@
</p></dd>
</dl>
</div>
<h4>
<a name="context.econtext.h22"></a>
<span><a name="context.econtext.struct__code__phrase_role__identifier__preallocated__phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext.struct__code__phrase_role__identifier__preallocated__phrase___code_">Struct
<code class="computeroutput"><span class="identifier">preallocated</span></code></a>
</h4>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">preallocated</span> <span class="special">{</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">;</span>
<span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">;</span>
<span class="identifier">preallocated</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">:</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_allocator</span> <span class="identifier">sctx</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<h4>
<a name="context.econtext.h23"></a>
<span><a name="context.econtext._code__phrase_role__identifier__preallocated__phrase__phrase_role__special_____phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special_____phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_allocator__phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"></a></span><a class="link" href="econtext.html#context.econtext._code__phrase_role__identifier__preallocated__phrase__phrase_role__special_____phrase___phrase_role__keyword__void__phrase___phrase_role__special_____phrase___phrase_role__identifier__sp__phrase__phrase_role__special_____phrase___phrase_role__identifier__std__phrase__phrase_role__special_____phrase__phrase_role__identifier__size_t__phrase___phrase_role__identifier__size__phrase__phrase_role__special_____phrase___phrase_role__identifier__stack_allocator__phrase___phrase_role__identifier__sctx__phrase__phrase_role__special_____phrase___code_"><code class="computeroutput"><span class="identifier">preallocated</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">:</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_allocator</span>
<span class="identifier">sctx</span><span class="special">)</span></code></a>
</h4>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates an object of preallocated.
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
@@ -684,7 +789,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="context.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="econtext/winfibers.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="requirements.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="ccontext.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -31,21 +31,22 @@
provides a sort of cooperative multitasking on a single thread. By providing
an abstraction of the current execution state in the current thread, including
the stack (with local variables) and stack pointer, all registers and CPU flags,
and the instruction pointer, a <span class="emphasis"><em>fcontext_t</em></span> instance represents
a specific point in the application's execution path. This is useful for building
higher-level abstractions, like <span class="emphasis"><em>coroutines</em></span>, <span class="emphasis"><em>cooperative
threads (userland threads)</em></span> or an equivalent to <a href="http://msdn.microsoft.com/en-us/library/9k7k7cf0%28v=vs.80%29.aspx" target="_top">C#
and the instruction pointer, a <span class="emphasis"><em>execution_context</em></span> or <span class="emphasis"><em>captured_context</em></span>
instance represents a specific point in the application's execution path. This
is useful for building higher-level abstractions, like <span class="emphasis"><em>coroutines</em></span>,
<span class="emphasis"><em>cooperative threads (userland threads)</em></span> or an equivalent
to <a href="http://msdn.microsoft.com/en-us/library/9k7k7cf0%28v=vs.80%29.aspx" target="_top">C#
keyword <span class="emphasis"><em>yield</em></span></a> in C++.
</p>
<p>
A <span class="emphasis"><em>fcontext_t</em></span> provides the means to suspend the current
execution path and to transfer execution control, thereby permitting another
<span class="emphasis"><em>fcontext_t</em></span> to run on the current thread. This state full
transfer mechanism enables a <span class="emphasis"><em>fcontext_t</em></span> to suspend execution
from within nested functions and, later, to resume from where it was suspended.
While the execution path represented by a <span class="emphasis"><em>fcontext_t</em></span> only
runs on a single thread, it can be migrated to another thread at any given
time.
<span class="emphasis"><em>execution_context</em></span> and <span class="emphasis"><em>captured_context</em></span>
provide the means to suspend the current execution path and to transfer execution
control, thereby permitting another context to run on the current thread. This
state full transfer mechanism enables a context to suspend execution from within
nested functions and, later, to resume from where it was suspended. While the
execution path represented by a <span class="emphasis"><em>execution_context</em></span> or
<span class="emphasis"><em>captured_context</em></span> only runs on a single thread, it can
be migrated to another thread at any given time.
</p>
<p>
A context switch between threads requires system calls (involving the OS kernel),
@@ -66,6 +67,15 @@
<p>
All functions and classes are contained in the namespace <span class="emphasis"><em>boost::context</em></span>.
</p>
<div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
<span class="emphasis"><em>execution_context</em></span> requires C++11!
</p></td></tr>
</table></div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>

View File

@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="prev" href="stack/valgrind.html" title="Support for valgrind">
<link rel="prev" href="struct__preallocated_.html" title="Struct preallocated">
<link rel="next" href="architectures.html" title="Architectures">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack/valgrind.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="architectures.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="struct__preallocated_.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="architectures.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -42,7 +42,6 @@
<col>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
@@ -55,11 +54,6 @@
ucontext_t
</p>
</th>
<th>
<p>
fcontext_t
</p>
</th>
<th>
<p>
execution_context
@@ -67,42 +61,14 @@
</th>
<th>
<p>
windows fibers
captured_context
</p>
</th>
</tr></thead>
<tbody>
<tr>
<tbody><tr>
<td>
<p>
i386 <sup>[<a name="context.performance.f0" href="#ftn.context.performance.f0" class="footnote">a</a>]</sup>
</p>
</td>
<td>
<p>
708 ns / 754 cycles
</p>
</td>
<td>
<p>
37 ns / 37 cycles
</p>
</td>
<td>
<p>
ns / cycles
</p>
</td>
<td>
<p>
ns / cycles
</p>
</td>
</tr>
<tr>
<td>
<p>
x86_64 <sup>[<a name="context.performance.f1" href="#ftn.context.performance.f1" class="footnote">b</a>]</sup>
x86_64 <sup>[<a name="context.performance.f0" href="#ftn.context.performance.f0" class="footnote">a</a>]</sup>
</p>
</td>
<td>
@@ -112,29 +78,18 @@
</td>
<td>
<p>
8 ns / 23 cycles
51 ns / 141 cycles
</p>
</td>
<td>
<p>
16 ns / 46 cycles
7 ns / 18 cycles
</p>
</td>
<td>
<p>
ns / cycles
</p>
</td>
</tr>
</tbody>
<tbody class="footnotes"><tr><td colspan="5">
<div class="footnote"><p><sup>[<a name="ftn.context.performance.f0" href="#context.performance.f0" class="para">a</a>] </sup>
AMD Athlon 64 DualCore 4400+
</p></div>
<div class="footnote"><p><sup>[<a name="ftn.context.performance.f1" href="#context.performance.f1" class="para">b</a>] </sup>
</tr></tbody>
<tbody class="footnotes"><tr><td colspan="4"><div class="footnote"><p><sup>[<a name="ftn.context.performance.f0" href="#context.performance.f0" class="para">a</a>] </sup>
Intel Core2 Q6700
</p></div>
</td></tr></tbody>
</p></div></td></tr></tbody>
</table></div>
</div>
<br class="table-break">
@@ -149,7 +104,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack/valgrind.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="architectures.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="struct__preallocated_.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="architectures.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -7,7 +7,7 @@
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="prev" href="overview.html" title="Overview">
<link rel="next" href="context.html" title="Struct fcontext_t">
<link rel="next" href="econtext.html" title="Class execution_context">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="context.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="econtext.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -85,7 +85,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="context.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="econtext.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="prev" href="econtext/winfibers.html" title="Using WinFiber-API">
<link rel="prev" href="ccontext.html" title="Class captured_context">
<link rel="next" href="stack/protected_fixedsize.html" title="Class protected_fixedsize">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -20,11 +20,11 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="econtext/winfibers.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack/protected_fixedsize.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="ccontext.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack/protected_fixedsize.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="context.stack"></a><a class="link" href="stack.html" title="Stack allocation">Stack allocation</a>
<a name="context.stack"></a><a name="stack"></a><a class="link" href="stack.html" title="Stack allocation">Stack allocation</a>
</h2></div></div></div>
<div class="toc"><dl>
<dt><span class="section"><a href="stack/protected_fixedsize.html">Class <span class="emphasis"><em>protected_fixedsize</em></span></a></span></dt>
@@ -177,7 +177,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="econtext/winfibers.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack/protected_fixedsize.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="ccontext.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="stack/protected_fixedsize.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -7,7 +7,7 @@
<link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../stack.html" title="Stack allocation">
<link rel="prev" href="stack_context.html" title="Class stack_context">
<link rel="next" href="../performance.html" title="Performance">
<link rel="next" href="../struct__preallocated_.html" title="Struct preallocated">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
@@ -20,7 +20,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack_context.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../performance.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="stack_context.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../struct__preallocated_.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
@@ -42,7 +42,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack_context.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../performance.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="stack_context.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stack.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../struct__preallocated_.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,66 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Struct preallocated</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Context">
<link rel="prev" href="stack/valgrind.html" title="Support for valgrind">
<link rel="next" href="performance.html" title="Performance">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
<td align="center"><a href="../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack/valgrind.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="performance.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="context.struct__preallocated_"></a><a class="link" href="struct__preallocated_.html" title="Struct preallocated">Struct <code class="computeroutput"><span class="identifier">preallocated</span></code></a>
</h2></div></div></div>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">preallocated</span> <span class="special">{</span>
<span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">;</span>
<span class="identifier">stack_context</span> <span class="identifier">sctx</span><span class="special">;</span>
<span class="identifier">preallocated</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">:</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_allocator</span> <span class="identifier">sctx</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<h4>
<a name="context.struct__preallocated_.h0"></a>
<span><a name="context.struct__preallocated_.constructor"></a></span><a class="link" href="struct__preallocated_.html#context.struct__preallocated_.constructor">Constructor</a>
</h4>
<pre class="programlisting"><span class="identifier">preallocated</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">*</span> <span class="identifier">sp</span><span class="special">,</span> <span class="identifier">std</span><span class="special">:</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">stack_allocator</span> <span class="identifier">sctx</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
</pre>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">Effects:</span></dt>
<dd><p>
Creates an object of preallocated.
</p></dd>
</dl>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright &#169; 2014 Oliver Kowalke<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stack/valgrind.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="performance.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -1,9 +1,8 @@
index.html
context/overview.html
context/requirements.html
context/context.html
context/econtext.html
context/econtext/winfibers.html
context/ccontext.html
context/stack.html
context/stack/protected_fixedsize.html
context/stack/fixedsize.html
@@ -11,6 +10,7 @@ context/stack/segmented.html
context/stack/stack_traits.html
context/stack/stack_context.html
context/stack/valgrind.html
context/struct__preallocated_.html
context/performance.html
context/architectures.html
context/architectures/crosscompiling.html

View File

@@ -38,9 +38,8 @@
<dl>
<dt><span class="section"><a href="context/overview.html">Overview</a></span></dt>
<dt><span class="section"><a href="context/requirements.html">Requirements</a></span></dt>
<dt><span class="section"><a href="context/context.html">Struct fcontext_t</a></span></dt>
<dt><span class="section"><a href="context/econtext.html">Class execution_context</a></span></dt>
<dd><dl><dt><span class="section"><a href="context/econtext/winfibers.html">Using WinFiber-API</a></span></dt></dl></dd>
<dt><span class="section"><a href="context/ccontext.html">Class captured_context</a></span></dt>
<dt><span class="section"><a href="context/stack.html">Stack allocation</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="context/stack/protected_fixedsize.html">Class <span class="emphasis"><em>protected_fixedsize</em></span></a></span></dt>
@@ -50,6 +49,7 @@
<dt><span class="section"><a href="context/stack/stack_context.html">Class <span class="emphasis"><em>stack_context</em></span></a></span></dt>
<dt><span class="section"><a href="context/stack/valgrind.html">Support for valgrind</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="context/struct__preallocated_.html">Struct <code class="computeroutput"><span class="identifier">preallocated</span></code></a></span></dt>
<dt><span class="section"><a href="context/performance.html">Performance</a></span></dt>
<dt><span class="section"><a href="context/architectures.html">Architectures</a></span></dt>
<dd><dl><dt><span class="section"><a href="context/architectures/crosscompiling.html">Cross compiling</a></span></dt></dl></dd>
@@ -65,7 +65,7 @@
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"><p><small>Last revised: October 18, 2015 at 18:54:04 GMT</small></p></td>
<td align="left"><p><small>Last revised: January 12, 2016 at 19:06:41 GMT</small></p></td>
<td align="right"><div class="copyright-footer"></div></td>
</tr></table>
<hr>

View File

@@ -11,18 +11,19 @@ __boost_context__ is a foundational library that provides a sort of cooperative
multitasking on a single thread. By providing an abstraction of the current
execution state in the current thread, including the stack (with local
variables) and stack pointer, all registers and CPU flags, and the instruction
pointer, a __fcontext__ instance represents a specific point in the application's
execution path. This is useful for building higher-level abstractions, like
__coroutines__, __coop_threads__ or an equivalent to
pointer, a __econtext__ or __ccontext__ instance represents a specific point in
the application's execution path. This is useful for building higher-level
abstractions, like __coroutines__, __coop_threads__ or an equivalent to
[@http://msdn.microsoft.com/en-us/library/9k7k7cf0%28v=vs.80%29.aspx C# keyword __yield__]
in C++.
A __fcontext__ provides the means to suspend the current execution path and to
transfer execution control, thereby permitting another __fcontext__ to run on the
current thread. This state full transfer mechanism enables a __fcontext__ to
suspend execution from within nested functions and, later, to resume from where
it was suspended. While the execution path represented by a __fcontext__ only
runs on a single thread, it can be migrated to another thread at any given time.
__econtext__ and __ccontext__ provide the means to suspend the current execution
path and to transfer execution control, thereby permitting another context to
run on the current thread. This state full transfer mechanism enables a context
to suspend execution from within nested functions and, later, to resume from
where it was suspended. While the execution path represented by a
__econtext__ or __ccontext__ only runs on a single thread, it can be migrated to
another thread at any given time.
A context switch between threads requires system calls (involving the OS
kernel), which can cost more than thousand CPU cycles on x86 CPUs. By contrast,
@@ -39,4 +40,6 @@ which includes all the other headers in turn.
All functions and classes are contained in the namespace __context_ns__.
[important __econtext__ requires C++11!]
[endsect]

View File

@@ -16,20 +16,12 @@ to a single CPU. The code was compiled using the build options,
'variant = release cxxflags = -DBOOST_DISABLE_ASSERTS'.
[table Performance of context switch
[[Platform] [ucontext_t] [fcontext_t] [execution_context] [windows fibers]]
[
[i386 [footnote AMD Athlon 64 DualCore 4400+]]
[708 ns / 754 cycles]
[37 ns / 37 cycles]
[ ns / cycles]
[ ns / cycles]
]
[[Platform] [ucontext_t] [execution_context] [captured_context]]
[
[x86_64 [footnote Intel Core2 Q6700]]
[547 ns / 1433 cycles]
[8 ns / 23 cycles]
[16 ns / 46 cycles]
[ ns / cycles]
[51 ns / 141 cycles]
[7 ns / 18 cycles]
]
]

27
doc/preallocated.qbk Normal file
View File

@@ -0,0 +1,27 @@
[/
Copyright Oliver Kowalke 2014.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt
]
[section Struct `preallocated`]
struct preallocated {
void * sp;
std::size_t size;
stack_context sctx;
preallocated( void * sp, std:size_t size, stack_allocator sctx) noexcept;
};
[heading Constructor]
preallocated( void * sp, std:size_t size, stack_allocator sctx) noexcept;
[variablelist
[[Effects:] [Creates an object of preallocated.]]
]
[endsect]

View File

@@ -5,6 +5,7 @@
http://www.boost.org/LICENSE_1_0.txt
]
[#stack]
[section:stack Stack allocation]
The memory used by the stack is allocated/deallocated via a __stack_allocator__