2
0
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:
Oliver Kowalke
2015-03-05 17:29:12 +01:00
7 changed files with 197 additions and 47 deletions

View File

@@ -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">[&amp;</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">&lt;</phrase> <phrase role="identifier">std</phrase><phrase role="special">::</phrase><phrase role="identifier">string</phrase> <phrase role="special">&gt;(</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">&amp;</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">&lt;&lt;</phrase> <phrase role="identifier">x</phrase><phrase role="special">(</phrase> <phrase role="number">7</phrase><phrase role="special">)</phrase> <phrase role="special">&lt;&lt;</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">&lt;&lt;</phrase> <phrase role="string">&quot;done&quot;</phrase> <phrase role="special">&lt;&lt;</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

View File

@@ -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`]

View File

@@ -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">[&amp;</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">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&gt;(</span> <span class="identifier">i</span><span class="special">);</span>
<span class="identifier">caller_</span><span class="special">.</span><span class="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">&amp;</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">&lt;&lt;</span> <span class="identifier">x</span><span class="special">(</span> <span class="number">7</span><span class="special">)</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"done"</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
<span class="special">}</span>
</pre>
<h4>
<a name="context.econtext.h2"></a>

View File

@@ -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>

View File

@@ -37,3 +37,11 @@ exe segmented
exe parser
: parser.cpp
;
exe fibonacci
: fibonacci.cpp
;
exe parameter
: parameter.cpp
;

View 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;
}

View 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;
}