mirror of
https://github.com/boostorg/context.git
synced 2026-01-23 17:32:16 +00:00
Merge branch 'develop'
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
|
||||
<library id="context" name="Context" dirname="context" last-revision="$Date: 2015/02/18 17:35:30 $"
|
||||
<library id="context" name="Context" dirname="context" last-revision="$Date: 2015/03/05 16:26:31 $"
|
||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<libraryinfo>
|
||||
<authorgroup>
|
||||
@@ -612,31 +612,47 @@
|
||||
role="identifier">exception_ptr</phrase></code> can used to store exceptions
|
||||
thrown inside the other context.
|
||||
</para>
|
||||
<programlisting><phrase role="keyword">class</phrase> <phrase role="identifier">my_context</phrase> <phrase role="special">{</phrase>
|
||||
<programlisting><phrase role="keyword">class</phrase> <phrase role="identifier">X</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="keyword">private</phrase><phrase role="special">:</phrase>
|
||||
<phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">exception_ptr</phrase> <phrase role="identifier">excptr_</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">execution_context</phrase> <phrase role="identifier">ctx_</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="keyword">int</phrase> <phrase role="special">*</phrase> <phrase role="identifier">inp_</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">string</phrase> <phrase role="identifier">outp_</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">exception_ptr</phrase> <phrase role="identifier">excptr_</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">boost</phrase><phrase role="special">::</phrase><phrase role="identifier">context</phrase><phrase role="special">::</phrase><phrase role="identifier">execution_context</phrase> <phrase role="identifier">caller_</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">boost</phrase><phrase role="special">::</phrase><phrase role="identifier">context</phrase><phrase role="special">::</phrase><phrase role="identifier">execution_context</phrase> <phrase role="identifier">callee_</phrase><phrase role="special">;</phrase>
|
||||
|
||||
<phrase role="keyword">public</phrase><phrase role="special">:</phrase>
|
||||
<phrase role="identifier">my_context</phrase><phrase role="special">()</phrase> <phrase role="special">:</phrase>
|
||||
<phrase role="identifier">X</phrase><phrase role="special">()</phrase> <phrase role="special">:</phrase>
|
||||
<phrase role="identifier">inp_</phrase><phrase role="special">(</phrase> <phrase role="keyword">nullptr</phrase><phrase role="special">),</phrase>
|
||||
<phrase role="identifier">outp_</phrase><phrase role="special">(),</phrase>
|
||||
<phrase role="identifier">excptr_</phrase><phrase role="special">(),</phrase>
|
||||
<phrase role="identifier">ctx_</phrase><phrase role="special">(</phrase> <phrase role="identifier">fixedsize_stack</phrase><phrase role="special">(),</phrase>
|
||||
<phrase role="special">[&</phrase><phrase role="identifier">excptr_</phrase><phrase role="special">](){</phrase>
|
||||
<phrase role="keyword">try</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="special">...</phrase>
|
||||
<phrase role="special">}</phrase> <phrase role="keyword">catch</phrase> <phrase role="special">(...)</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="identifier">excptr_</phrase> <phrase role="special">=</phrase> <phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">current_exception</phrase><phrase role="special">();</phrase>
|
||||
<phrase role="special">}</phrase>
|
||||
<phrase role="special">})</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="special">}</phrase>
|
||||
<phrase role="identifier">caller_</phrase><phrase role="special">(</phrase> <phrase role="identifier">boost</phrase><phrase role="special">::</phrase><phrase role="identifier">context</phrase><phrase role="special">::</phrase><phrase role="identifier">execution_context</phrase><phrase role="special">::</phrase><phrase role="identifier">current</phrase><phrase role="special">()</phrase> <phrase role="special">),</phrase>
|
||||
<phrase role="identifier">callee_</phrase><phrase role="special">(</phrase> <phrase role="identifier">boost</phrase><phrase role="special">::</phrase><phrase role="identifier">context</phrase><phrase role="special">::</phrase><phrase role="identifier">fixedsize_stack</phrase><phrase role="special">(),</phrase>
|
||||
<phrase role="special">[=]</phrase> <phrase role="special">()</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="keyword">try</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="keyword">int</phrase> <phrase role="identifier">i</phrase> <phrase role="special">=</phrase> <phrase role="special">*</phrase> <phrase role="identifier">inp_</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">outp_</phrase> <phrase role="special">=</phrase> <phrase role="identifier">boost</phrase><phrase role="special">::</phrase><phrase role="identifier">lexical_cast</phrase><phrase role="special"><</phrase> <phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">string</phrase> <phrase role="special">>(</phrase> <phrase role="identifier">i</phrase><phrase role="special">);</phrase>
|
||||
<phrase role="identifier">caller_</phrase><phrase role="special">.</phrase><phrase role="identifier">resume</phrase><phrase role="special">();</phrase>
|
||||
<phrase role="special">}</phrase> <phrase role="keyword">catch</phrase> <phrase role="special">(...)</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="identifier">excptr_</phrase> <phrase role="special">=</phrase> <phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">current_exception</phrase><phrase role="special">();</phrase>
|
||||
<phrase role="special">}</phrase>
|
||||
<phrase role="special">})</phrase>
|
||||
<phrase role="special">{}</phrase>
|
||||
|
||||
<phrase role="keyword">void</phrase> <phrase role="identifier">run</phrase><phrase role="special">()</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="identifier">ctx_</phrase><phrase role="special">.</phrase><phrase role="identifier">resume</phrase><phrase role="special">();</phrase>
|
||||
<phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">string</phrase> <phrase role="keyword">operator</phrase><phrase role="special">()(</phrase> <phrase role="keyword">int</phrase> <phrase role="identifier">i</phrase><phrase role="special">)</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="identifier">inp_</phrase> <phrase role="special">=</phrase> <phrase role="special">&</phrase> <phrase role="identifier">i</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">callee_</phrase><phrase role="special">.</phrase><phrase role="identifier">resume</phrase><phrase role="special">();</phrase>
|
||||
<phrase role="keyword">if</phrase> <phrase role="special">(</phrase> <phrase role="identifier">excptr_</phrase><phrase role="special">)</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">rethrow_exception</phrase><phrase role="special">(</phrase> <phrase role="identifier">excptr_</phrase><phrase role="special">);</phrase>
|
||||
<phrase role="special">}</phrase>
|
||||
<phrase role="keyword">return</phrase> <phrase role="identifier">outp_</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="special">}</phrase>
|
||||
<phrase role="special">};</phrase>
|
||||
|
||||
<phrase role="keyword">int</phrase> <phrase role="identifier">main</phrase><phrase role="special">()</phrase> <phrase role="special">{</phrase>
|
||||
<phrase role="identifier">X</phrase> <phrase role="identifier">x</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase> <phrase role="special"><<</phrase> <phrase role="identifier">x</phrase><phrase role="special">(</phrase> <phrase role="number">7</phrase><phrase role="special">)</phrase> <phrase role="special"><<</phrase> <phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">cout</phrase> <phrase role="special"><<</phrase> <phrase role="string">"done"</phrase> <phrase role="special"><<</phrase> <phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">endl</phrase><phrase role="special">;</phrase>
|
||||
<phrase role="special">}</phrase>
|
||||
</programlisting>
|
||||
<bridgehead renderas="sect3" id="context.econtext.h2">
|
||||
<phrase id="context.econtext.class__code__phrase_role__identifier__execution_context__phrase___code_"/><link
|
||||
|
||||
@@ -121,32 +121,51 @@ of the stack.]
|
||||
If the function executed inside a __econtext__ emitts ans exception, `std::terminate()` is
|
||||
called - `std::exception_ptr` can used to store exceptions thrown inside the other context.
|
||||
|
||||
class my_context {
|
||||
[heading parameter passing]
|
||||
Input and output parameters are transfered via a lambda capture list and references/pointers.
|
||||
|
||||
class X {
|
||||
private:
|
||||
std::exception_ptr excptr_;
|
||||
execution_context ctx_;
|
||||
int * inp_;
|
||||
std::string outp_;
|
||||
std::exception_ptr excptr_;
|
||||
boost::context::execution_context caller_;
|
||||
boost::context::execution_context callee_;
|
||||
|
||||
public:
|
||||
my_context() :
|
||||
X() :
|
||||
inp_( nullptr),
|
||||
outp_(),
|
||||
excptr_(),
|
||||
ctx_( fixedsize_stack(),
|
||||
[&excptr_](){
|
||||
try {
|
||||
...
|
||||
} catch (...) {
|
||||
excptr_ = std::current_exception();
|
||||
}
|
||||
}) {
|
||||
}
|
||||
caller_( boost::context::execution_context::current() ),
|
||||
callee_( boost::context::fixedsize_stack(),
|
||||
[=] () {
|
||||
try {
|
||||
int i = * inp_;
|
||||
outp_ = boost::lexical_cast< std::string >( i);
|
||||
caller_.resume();
|
||||
} catch (...) {
|
||||
excptr_ = std::current_exception();
|
||||
}
|
||||
})
|
||||
{}
|
||||
|
||||
void run() {
|
||||
ctx_.resume();
|
||||
std::string operator()( int i) {
|
||||
inp_ = & i;
|
||||
callee_.resume();
|
||||
if ( excptr_) {
|
||||
std::rethrow_exception( excptr_);
|
||||
}
|
||||
return outp_;
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
X x;
|
||||
std::cout << x( 7) << std::endl;
|
||||
std::cout << "done" << std::endl;
|
||||
}
|
||||
|
||||
|
||||
[heading Class `execution_context`]
|
||||
|
||||
|
||||
@@ -180,31 +180,47 @@
|
||||
is called - <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span></code> can used to store exceptions
|
||||
thrown inside the other context.
|
||||
</p>
|
||||
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">my_context</span> <span class="special">{</span>
|
||||
<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">execution_context</span> <span class="identifier">ctx_</span><span class="special">;</span>
|
||||
<span class="keyword">int</span> <span class="special">*</span> <span class="identifier">inp_</span><span class="special">;</span>
|
||||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">outp_</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">my_context</span><span class="special">()</span> <span class="special">:</span>
|
||||
<span class="identifier">X</span><span class="special">()</span> <span class="special">:</span>
|
||||
<span class="identifier">inp_</span><span class="special">(</span> <span class="keyword">nullptr</span><span class="special">),</span>
|
||||
<span class="identifier">outp_</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="identifier">fixedsize_stack</span><span class="special">(),</span>
|
||||
<span class="special">[&</span><span class="identifier">excptr_</span><span class="special">](){</span>
|
||||
<span class="keyword">try</span> <span class="special">{</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="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="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="special">[=]</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="identifier">inp_</span><span class="special">;</span>
|
||||
<span class="identifier">outp_</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="identifier">resume</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="keyword">void</span> <span class="identifier">run</span><span class="special">()</span> <span class="special">{</span>
|
||||
<span class="identifier">ctx_</span><span class="special">.</span><span class="identifier">resume</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="identifier">inp_</span> <span class="special">=</span> <span class="special">&</span> <span class="identifier">i</span><span class="special">;</span>
|
||||
<span class="identifier">callee_</span><span class="special">.</span><span class="identifier">resume</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="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="identifier">outp_</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>
|
||||
<h4>
|
||||
<a name="context.econtext.h2"></a>
|
||||
|
||||
@@ -63,7 +63,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: February 18, 2015 at 17:39:58 GMT</small></p></td>
|
||||
<td align="left"><p><small>Last revised: March 05, 2015 at 16:26:35 GMT</small></p></td>
|
||||
<td align="right"><div class="copyright-footer"></div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
|
||||
@@ -37,3 +37,11 @@ exe segmented
|
||||
exe parser
|
||||
: parser.cpp
|
||||
;
|
||||
|
||||
exe fibonacci
|
||||
: fibonacci.cpp
|
||||
;
|
||||
|
||||
exe parameter
|
||||
: parameter.cpp
|
||||
;
|
||||
|
||||
36
example/execution_context/fibonacci.cpp
Normal file
36
example/execution_context/fibonacci.cpp
Normal file
@@ -0,0 +1,36 @@
|
||||
|
||||
// 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)
|
||||
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
#include <boost/context/all.hpp>
|
||||
|
||||
#define yield(x) p=x; mctx.resume();
|
||||
|
||||
int main() {
|
||||
int n=35;
|
||||
int p=0;
|
||||
boost::context::execution_context mctx( boost::context::execution_context::current() );
|
||||
boost::context::execution_context ctx(
|
||||
boost::context::fixedsize_stack(),
|
||||
[n,&p,mctx]()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.resume();
|
||||
std::cout<<p<<std::endl;
|
||||
}
|
||||
|
||||
std::cout << "main: done" << std::endl;
|
||||
}
|
||||
55
example/execution_context/parameter.cpp
Normal file
55
example/execution_context/parameter.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
|
||||
// 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)
|
||||
|
||||
#include <cstdlib>
|
||||
#include <exception>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include <boost/context/all.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
class X{
|
||||
private:
|
||||
int * inp_;
|
||||
std::string outp_;
|
||||
std::exception_ptr excptr_;
|
||||
boost::context::execution_context caller_;
|
||||
boost::context::execution_context callee_;
|
||||
|
||||
public:
|
||||
X():
|
||||
inp_( nullptr),
|
||||
outp_(),
|
||||
excptr_(),
|
||||
caller_(boost::context::execution_context::current()),
|
||||
callee_(boost::context::fixedsize_stack(),
|
||||
[=](){
|
||||
try {
|
||||
int i = * inp_;
|
||||
outp_ = boost::lexical_cast<std::string>(i);
|
||||
caller_.resume();
|
||||
} catch (...) {
|
||||
excptr_=std::current_exception();
|
||||
}
|
||||
})
|
||||
{}
|
||||
|
||||
std::string operator()(int i){
|
||||
inp_ = & i;
|
||||
callee_.resume();
|
||||
if(excptr_){
|
||||
std::rethrow_exception(excptr_);
|
||||
}
|
||||
return outp_;
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
X x;
|
||||
std::cout<<x(7)<<std::endl;
|
||||
std::cout << "done" << std::endl;
|
||||
}
|
||||
Reference in New Issue
Block a user