mirror of
https://github.com/boostorg/context.git
synced 2026-01-19 04:02:17 +00:00
documentation updated
This commit is contained in:
410
doc/captured_context.qbk
Normal file
410
doc/captured_context.qbk
Normal 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]
|
||||
@@ -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[] '''—''']
|
||||
[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]
|
||||
|
||||
1658
doc/context.xml
1658
doc/context.xml
File diff suppressed because it is too large
Load Diff
@@ -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]
|
||||
|
||||
@@ -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
|
||||
|
||||
72
doc/html/context/abstract_context.html
Normal file
72
doc/html/context/abstract_context.html
Normal 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 1. Context">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. 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 © 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>
|
||||
739
doc/html/context/abstract_context/ccontext.html
Normal file
739
doc/html/context/abstract_context/ccontext.html
Normal 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 1. 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 ---> E '\0'
|
||||
* E ---> T {('+'|'-') T}
|
||||
* T ---> S {('*'|'/') S}
|
||||
* S ---> 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">[&</span><span class="identifier">is</span><span class="special">,&</span><span class="identifier">done</span><span class="special">,&</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">[&</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">&</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"><</span><span class="number">0</span><span class="special">>(</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"><</span><span class="number">0</span><span class="special">>(</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"><</span><span class="number">1</span><span class="special">>(</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"><</span> <span class="keyword">char</span><span class="special">*</span> <span class="special">>(</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"><</span> <span class="keyword">char</span> <span class="special">*</span> <span class="special">>(</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">->~</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"><</span> <span class="keyword">typename</span> <span class="identifier">StackAllocator</span> <span class="special">></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">)-></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"><</span> <span class="keyword">int</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">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"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>(</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">&</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"><</span><span class="number">0</span><span class="special">>(</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"><</span><span class="number">1</span><span class="special">>(</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">&)</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">&</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"><</span><span class="number">0</span><span class="special">>(</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"><</span><span class="number">1</span><span class="special">>(</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"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">*</span> <span class="special">>(</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"><<</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special"><<</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"><</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">></span>
|
||||
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&&</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="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="special">&&</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">&</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">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&</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"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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="keyword">nullptr</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&</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">&</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">&</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">&</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">&</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"><</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">></span>
|
||||
<span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span>
|
||||
<span class="keyword">operator</span><span class="special"><<(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&</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"><</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">></span> <span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&&</span>
|
||||
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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"><</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">></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">&&</span>
|
||||
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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"><</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">></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">&&</span>
|
||||
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&&</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">&</span>
|
||||
<span class="keyword">operator</span><span class="special">=(</span>
|
||||
<span class="identifier">captured_context</span> <span class="special">&&</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"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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"><</span> <span class="identifier">captured_context</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></code></a>
|
||||
</h5>
|
||||
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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="keyword">nullptr</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&</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"><</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">&</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">></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">&</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"><</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"><=</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">&</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"><</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">>=</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">&</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"><</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"><<</span></code></a>
|
||||
</h5>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span>
|
||||
<span class="keyword">operator</span><span class="special"><<(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&</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 © 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>
|
||||
737
doc/html/context/abstract_context/econtext.html
Normal file
737
doc/html/context/abstract_context/econtext.html
Normal 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 1. 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 ---> E '\0'
|
||||
* E ---> T {('+'|'-') T}
|
||||
* T ---> S {('*'|'/') S}
|
||||
* S ---> 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">[&</span><span class="identifier">main_ctx</span><span class="special">,&</span><span class="identifier">is</span><span class="special">,&</span><span class="identifier">done</span><span class="special">,&</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">[&</span><span class="identifier">main_ctx</span><span class="special">,&</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">&</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"><</span> <span class="keyword">char</span><span class="special">*</span> <span class="special">>(</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"><<</span> <span class="string">"main: done"</span> <span class="special"><<</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"><</span> <span class="keyword">char</span> <span class="special">*</span> <span class="special">>(</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">->~</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"><</span> <span class="keyword">typename</span> <span class="identifier">StackAllocator</span> <span class="special">></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"><</span> <span class="keyword">int</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">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"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>(</span><span class="identifier">i</span><span class="special">);</span>
|
||||
<span class="identifier">caller_</span><span class="special">(</span> <span class="special">&</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">&</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"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">*</span> <span class="special">>(</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"><<</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special"><<</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"><<</span> <span class="string">"done"</span> <span class="special"><<</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"><</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">></span>
|
||||
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&&</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="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&</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="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="special">&&</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"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&</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">&</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">&</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">&</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">&</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"><</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">></span>
|
||||
<span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span>
|
||||
<span class="keyword">operator</span><span class="special"><<(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&</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"><</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">></span> <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&&</span>
|
||||
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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"><</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">></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">&&</span>
|
||||
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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"><</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">></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">&&</span>
|
||||
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&&</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">&</span>
|
||||
<span class="keyword">operator</span><span class="special">=(</span>
|
||||
<span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&</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">&</span>
|
||||
<span class="keyword">operator</span><span class="special">=(</span>
|
||||
<span class="identifier">execution_context</span> <span class="special">&&</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"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&</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"><</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">&</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">></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">&</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"><</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"><=</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">&</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"><</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">>=</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">&</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"><</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"><<</span></code></a>
|
||||
</h5>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span>
|
||||
<span class="keyword">operator</span><span class="special"><<(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&</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 © 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>
|
||||
188
doc/html/context/abstract_context/stack.html
Normal file
188
doc/html/context/abstract_context/stack.html
Normal 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 1. 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 © 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>
|
||||
113
doc/html/context/abstract_context/stack/fixedsize.html
Normal file
113
doc/html/context/abstract_context/stack/fixedsize.html
Normal 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 1. 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"><</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">></span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">traitsT</span> <span class="special">></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">&);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">basic_fixedsize_stack</span><span class="special"><</span> <span class="identifier">stack_traits</span> <span class="special">></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"><=</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">&&</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">>=</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">&</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"><=</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">&&</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">>=</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 © 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>
|
||||
136
doc/html/context/abstract_context/stack/protected_fixedsize.html
Normal file
136
doc/html/context/abstract_context/stack/protected_fixedsize.html
Normal 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 1. 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"><</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">></span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">traitsT</span> <span class="special">></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">&);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">basic_protected_fixedsize</span><span class="special"><</span> <span class="identifier">stack_traits</span> <span class="special">></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"><=</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">&&</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">>=</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">&</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"><=</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">&&</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">>=</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 © 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>
|
||||
139
doc/html/context/abstract_context/stack/segmented.html
Normal file
139
doc/html/context/abstract_context/stack/segmented.html
Normal 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 1. 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"><</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">></span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">traitsT</span> <span class="special">></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">&);</span>
|
||||
<span class="special">}</span>
|
||||
|
||||
<span class="keyword">typedef</span> <span class="identifier">basic_segmented_stack</span><span class="special"><</span> <span class="identifier">stack_traits</span> <span class="special">></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"><=</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">&&</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">>=</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">&</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"><=</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">&&</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">>=</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 © 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>
|
||||
85
doc/html/context/abstract_context/stack/stack_context.html
Normal file
85
doc/html/context/abstract_context/stack/stack_context.html
Normal 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 1. 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 © 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>
|
||||
159
doc/html/context/abstract_context/stack/stack_traits.html
Normal file
159
doc/html/context/abstract_context/stack/stack_traits.html
Normal 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 1. 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"><</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">></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 © 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>
|
||||
49
doc/html/context/abstract_context/stack/valgrind.html
Normal file
49
doc/html/context/abstract_context/stack/valgrind.html
Normal 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 1. 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 © 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>
|
||||
707
doc/html/context/ccontext.html
Normal file
707
doc/html/context/ccontext.html
Normal 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 1. Context">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. 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 ---> E '\0'
|
||||
* E ---> T {('+'|'-') T}
|
||||
* T ---> S {('*'|'/') S}
|
||||
* S ---> 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">[&</span><span class="identifier">is</span><span class="special">,&</span><span class="identifier">done</span><span class="special">,&</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">[&</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">&</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"><</span><span class="number">0</span><span class="special">>(</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"><</span><span class="number">0</span><span class="special">>(</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"><</span><span class="number">1</span><span class="special">>(</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"><</span> <span class="keyword">char</span><span class="special">*</span> <span class="special">>(</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"><</span> <span class="keyword">char</span> <span class="special">*</span> <span class="special">>(</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">->~</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"><</span> <span class="keyword">typename</span> <span class="identifier">StackAllocator</span> <span class="special">></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">)-></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"><</span> <span class="keyword">int</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">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"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">>(</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">&</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"><</span><span class="number">0</span><span class="special">>(</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"><</span><span class="number">1</span><span class="special">>(</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">&)</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">&</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"><</span><span class="number">0</span><span class="special">>(</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"><</span><span class="number">1</span><span class="special">>(</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"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">*</span> <span class="special">>(</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"><<</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special"><<</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"><</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">></span>
|
||||
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&&</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="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="special">&&</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">&</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">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&</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"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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="keyword">nullptr</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&</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">&</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">&</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">&</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">&</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"><</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">></span>
|
||||
<span class="keyword">friend</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span>
|
||||
<span class="keyword">operator</span><span class="special"><<(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&</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"><</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">></span>
|
||||
<span class="identifier">captured_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&&</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">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">captured_context</span> <span class="special">&&</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"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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="keyword">nullptr</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> <span class="identifier">captured_context</span><span class="special">,</span> <span class="keyword">void</span> <span class="special">*</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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&</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<</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">&</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></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">&</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"><</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<=</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">&</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"><</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>=</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">&</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"><</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<<()</code></a>
|
||||
</h5>
|
||||
<p>
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span>
|
||||
<span class="keyword">operator</span><span class="special"><<(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">captured_context</span> <span class="keyword">const</span><span class="special">&</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 © 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>
|
||||
@@ -7,7 +7,7 @@
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Context">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. 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"><<</span><span class="string">"f1: entered"</span><span class="special"><<</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"><<</span><span class="string">"f1: call jump_fcontext( & fc1, fc2, 0)"</span><span class="special"><<</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">(&</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"><<</span><span class="string">"f2: entered"</span><span class="special"><<</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"><<</span><span class="string">"f2: call jump_fcontext( & fc2, fc1, 0)"</span><span class="special"><<</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"><</span><span class="keyword">int</span><span class="special">,</span><span class="keyword">int</span><span class="special">></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">(&</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">-></span><span class="identifier">first</span><span class="special">+</span><span class="identifier">p</span><span class="special">-></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">(&</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">-></span><span class="identifier">first</span><span class="special">+</span><span class="identifier">p</span><span class="special">-></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">(&</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">-></span><span class="identifier">first</span><span class="special">+</span><span class="identifier">p</span><span class="special">-></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">(&</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">-></span><span class="identifier">first</span><span class="special">+</span><span class="identifier">p</span><span class="special">-></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">(&</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">)&</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">(&</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">*)&</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"><<</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">first</span><span class="special"><<</span><span class="string">" + "</span><span class="special"><<</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span><span class="special"><<</span><span class="string">" == "</span><span class="special"><<</span><span class="identifier">res</span><span class="special"><<</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">(&</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">)&</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">(&</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">*)&</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"><<</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">first</span><span class="special"><<</span><span class="string">" + "</span><span class="special"><<</span><span class="identifier">p</span><span class="special">.</span><span class="identifier">second</span><span class="special"><<</span><span class="string">" == "</span><span class="special"><<</span><span class="identifier">res</span><span class="special"><<</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"><</span><span class="identifier">opaque</span> <span class="identifier">pointer</span> <span class="special">></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>
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Context">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. 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">,&</span><span class="identifier">p</span><span class="special">,&</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">--></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"><</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"><<</span><span class="identifier">p</span><span class="special"><<</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 ---> 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"><<</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special"><<</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"><<</span> <span class="string">"done"</span> <span class="special"><<</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"><<</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special"><<</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"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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"><<(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&</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"><</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">></span> <span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&&</span>
|
||||
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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"><</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">></span>
|
||||
<span class="identifier">execution_context</span><span class="special">(</span> <span class="identifier">Fn</span> <span class="special">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</span><span class="special"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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"><</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">></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">&&</span>
|
||||
<span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span>
|
||||
<span class="special">&&</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">&</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">&</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">&&</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">&&</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">&</span>
|
||||
<span class="keyword">operator</span><span class="special">=(</span>
|
||||
<span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&</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">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&</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">&</span>
|
||||
<span class="keyword">operator</span><span class="special">=(</span>
|
||||
<span class="identifier">execution_context</span> <span class="special">&&</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">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">execution_context</span> <span class="special">&&</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"><</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</span> <span class="special">...</span> <span class="identifier">args</span><span class="special">);</span>
|
||||
|
||||
<span class="keyword">template</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">></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">&&</span> <span class="identifier">fn</span><span class="special">,</span> <span class="identifier">Args</span> <span class="special">&&</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">&</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">&</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<</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"><</span></code></a>
|
||||
</h4>
|
||||
<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">&</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">></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></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">&</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"><=</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<=</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">&</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">>=</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>=</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">&</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"><<</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<<()</code></a>
|
||||
</h5>
|
||||
<p>
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">template</span><span class="special"><</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">></span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span>
|
||||
<span class="keyword">operator</span><span class="special"><<(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_ostream</span><span class="special"><</span> <span class="identifier">charT</span><span class="special">,</span> <span class="identifier">traitsT</span> <span class="special">></span> <span class="special">&</span> <span class="identifier">os</span><span class="special">,</span> <span class="identifier">execution_context</span> <span class="keyword">const</span><span class="special">&</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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Context">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. 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>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Context">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. 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>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||
<link rel="home" href="../index.html" title="Chapter 1. Context">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. 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>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<link rel="home" href="../../index.html" title="Chapter 1. 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>
|
||||
|
||||
66
doc/html/context/struct__preallocated_.html
Normal file
66
doc/html/context/struct__preallocated_.html
Normal 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 1. Context">
|
||||
<link rel="up" href="../index.html" title="Chapter 1. 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 © 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>
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
27
doc/preallocated.qbk
Normal 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]
|
||||
@@ -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__
|
||||
|
||||
Reference in New Issue
Block a user