1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> 4<title>Class execution_context (version 1)</title> 5<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.75.2"> 7<link rel="home" href="../index.html" title="Chapter 1. Context"> 8<link rel="up" href="../index.html" title="Chapter 1. Context"> 9<link rel="prev" href="ecv2.html" title="Class execution_context (version 2)"> 10<link rel="next" href="stack.html" title="Stack allocation"> 11</head> 12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 13<table cellpadding="2" width="100%"><tr> 14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> 15<td align="center"><a href="../../../../../index.html">Home</a></td> 16<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> 17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 19<td align="center"><a href="../../../../../more/index.htm">More</a></td> 20</tr></table> 21<hr> 22<div class="spirit-nav"> 23<a accesskey="p" href="ecv2.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> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 27<a name="context.ecv1"></a><a name="ecv1"></a><a class="link" href="ecv1.html" title="Class execution_context (version 1)">Class execution_context 28 (version 1)</a> 29</h2></div></div></div> 30<div class="warning"><table border="0" summary="Warning"> 31<tr> 32<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../../doc/src/images/warning.png"></td> 33<th align="left">Warning</th> 34</tr> 35<tr><td align="left" valign="top"><p> 36 <span class="emphasis"><em>execution_context</em></span> (v1) is deprecated (does not prevent 37 UB). 38 </p></td></tr> 39</table></div> 40<div class="note"><table border="0" summary="Note"> 41<tr> 42<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> 43<th align="left">Note</th> 44</tr> 45<tr><td align="left" valign="top"><p> 46 <span class="emphasis"><em>execution_context</em></span> (v1) is the reference implementation 47 of C++ proposal <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0099r0.pdf" target="_top">P099R0: 48 A low-level API for stackful context switching</a>. 49 </p></td></tr> 50</table></div> 51<div class="note"><table border="0" summary="Note"> 52<tr> 53<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> 54<th align="left">Note</th> 55</tr> 56<tr><td align="left" valign="top"><p> 57 <span class="emphasis"><em>execution_context</em></span> (v1) resides in sub-namespace <code class="computeroutput"><span class="identifier">v1</span></code>. 58 </p></td></tr> 59</table></div> 60<div class="note"><table border="0" summary="Note"> 61<tr> 62<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> 63<th align="left">Note</th> 64</tr> 65<tr><td align="left" valign="top"><p> 66 Segmented stacks (<span class="emphasis"><em>segmented-stacks=on</em></span>), e.g. on demand 67 growing stacks, can be used with <span class="emphasis"><em>execution_context</em></span> (v1). 68 </p></td></tr> 69</table></div> 70<p> 71 Class <span class="emphasis"><em>execution_context</em></span> encapsulates context switching 72 and manages the associated context' stack (allocation/deallocation). 73 </p> 74<p> 75 <span class="emphasis"><em>execution_context</em></span> allocates the context stack (using its 76 <a class="link" href="stack.html#stack"><span class="emphasis"><em>StackAllocator</em></span></a> argument) 77 and creates a control structure on top of it. This structure is responsible 78 for managing context' stack. Instances of <span class="emphasis"><em>execution_context</em></span>, 79 associated with a specific context, share the ownership of the control structure. 80 If the last reference goes out of scope, the control structure is destroyed 81 and the stack gets deallocated via the <span class="emphasis"><em>StackAllocator</em></span>. 82 </p> 83<p> 84 <span class="emphasis"><em>execution_context</em></span> is copy-constructible, move-constructible, 85 copy-assignable and move-assignable. 86 </p> 87<p> 88 <span class="emphasis"><em>execution_context</em></span> maintains a static (thread-local) pointer, 89 accessed by <span class="emphasis"><em>execution_context::current()</em></span>, pointing to 90 the active context. On each context switch the pointer is updated. The usage 91 of this global pointer makes the context switch a little bit slower (due access 92 of thread local storage) but has some advantages. It allows to access the control 93 structure of the current active context from arbitrary code paths required 94 in order to support segmented stacks, which require to call certain maintenance 95 functions (like __splitstack_getcontext() etc.) before each context switch 96 (each context switch exchanges the stack). 97 </p> 98<p> 99 <span class="emphasis"><em>execution_context</em></span> expects a function/functor with signature 100 <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> 101 is the data passed at the first invocation of <a class="link" href="ecv1.html#ecv1_operator_call"> <code class="computeroutput">ecv1::operator()()</code></a>). 102 </p> 103<h4> 104<a name="context.ecv1.h0"></a> 105 <span><a name="context.ecv1.usage_of__emphasis_execution_context__emphasis_"></a></span><a class="link" href="ecv1.html#context.ecv1.usage_of__emphasis_execution_context__emphasis_">usage 106 of <span class="emphasis"><em>execution_context</em></span></a> 107 </h4> 108<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> 109<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">sink</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">v1</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">());</span> 110<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">source</span><span class="special">(</span> 111 <span class="special">[</span><span class="identifier">n</span><span class="special">,&</span><span class="identifier">sink</span><span class="special">](</span><span class="keyword">void</span><span class="special">*)</span><span class="keyword">mutable</span><span class="special">{</span> 112 <span class="keyword">int</span> <span class="identifier">a</span><span class="special">=</span><span class="number">0</span><span class="special">;</span> 113 <span class="keyword">int</span> <span class="identifier">b</span><span class="special">=</span><span class="number">1</span><span class="special">;</span> 114 <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> 115 <span class="identifier">sink</span><span class="special">(&</span><span class="identifier">a</span><span class="special">);</span> 116 <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> 117 <span class="identifier">a</span><span class="special">=</span><span class="identifier">b</span><span class="special">;</span> 118 <span class="identifier">b</span><span class="special">=</span><span class="identifier">next</span><span class="special">;</span> 119 <span class="special">}</span> 120 <span class="special">});</span> 121<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> 122 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span><span class="special"><<*(</span><span class="keyword">int</span><span class="special">*)</span><span class="identifier">source</span><span class="special">()<<</span><span class="string">" "</span><span class="special">;</span> 123<span class="special">}</span> 124 125<span class="identifier">output</span><span class="special">:</span> 126 <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> 127</pre> 128<p> 129 This simple example demonstrates the basic usage of <span class="emphasis"><em>execution_context</em></span>. 130 The context <code class="computeroutput"><span class="identifier">sink</span></code>, returned 131 by <span class="emphasis"><em>execution_context::current()</em></span>, represents the <span class="emphasis"><em>main</em></span>-context 132 (function <span class="emphasis"><em>main()</em></span> running) and is one of the captured parameters 133 in the lambda expression. The lambda that calculates the Fibonacci numbers 134 is executed inside the context represented by <code class="computeroutput"><span class="identifier">source</span></code>. 135 Calculated Fibonacci numbers are transferred between the two context' via expression 136 <span class="emphasis"><em>sink(&a)</em></span> (and returned by <span class="emphasis"><em>source()</em></span>). 137 </p> 138<p> 139 The locale variables <code class="computeroutput"><span class="identifier">a</span></code>, <code class="computeroutput"><span class="identifier">b</span></code> and <code class="computeroutput"> <span class="identifier">next</span></code> 140 remain their values during each context switch (<span class="emphasis"><em>yield(a)</em></span>). 141 This is possible because <code class="computeroutput"><span class="identifier">ctx</span></code> 142 owns a stack (exchanged by context switch). 143 </p> 144<h4> 145<a name="context.ecv1.h1"></a> 146 <span><a name="context.ecv1.inverting_the_control_flow"></a></span><a class="link" href="ecv1.html#context.ecv1.inverting_the_control_flow">inverting 147 the control flow</a> 148 </h4> 149<pre class="programlisting"><span class="comment">/* 150 * grammar: 151 * P ---> E '\0' 152 * E ---> T {('+'|'-') T} 153 * T ---> S {('*'|'/') S} 154 * S ---> digit | '(' E ')' 155 */</span> 156<span class="keyword">class</span> <span class="identifier">Parser</span><span class="special">{</span> 157 <span class="comment">// implementation omitted; see examples directory</span> 158<span class="special">};</span> 159 160<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> 161<span class="keyword">bool</span> <span class="identifier">done</span><span class="special">=</span><span class="keyword">false</span><span class="special">;</span> 162<span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">except</span><span class="special">;</span> 163 164<span class="comment">// create handle to main execution context</span> 165<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">v1</span><span class="special">::</span><span class="identifier">execution_context</span><span class="special">::</span><span class="identifier">current</span><span class="special">());</span> 166<span class="comment">// execute parser in new execution context</span> 167<span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">source</span><span class="special">(</span> 168 <span class="special">[&</span><span class="identifier">sink</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> 169 <span class="comment">// create parser with callback function</span> 170 <span class="identifier">Parser</span> <span class="identifier">p</span><span class="special">(</span><span class="identifier">is</span><span class="special">,</span> 171 <span class="special">[&</span><span class="identifier">sink</span><span class="special">](</span><span class="keyword">char</span> <span class="identifier">ch</span><span class="special">){</span> 172 <span class="comment">// resume main execution context</span> 173 <span class="identifier">sink</span><span class="special">(&</span><span class="identifier">ch</span><span class="special">);</span> 174 <span class="special">});</span> 175 <span class="keyword">try</span> <span class="special">{</span> 176 <span class="comment">// start recursive parsing</span> 177 <span class="identifier">p</span><span class="special">.</span><span class="identifier">run</span><span class="special">();</span> 178 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(...)</span> <span class="special">{</span> 179 <span class="comment">// store other exceptions in exception-pointer</span> 180 <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> 181 <span class="special">}</span> 182 <span class="comment">// set termination flag</span> 183 <span class="identifier">done</span><span class="special">=</span><span class="keyword">true</span><span class="special">;</span> 184 <span class="comment">// resume main execution context</span> 185 <span class="identifier">sink</span><span class="special">();</span> 186 <span class="special">});</span> 187 188<span class="comment">// user-code pulls parsed data from parser</span> 189<span class="comment">// invert control flow</span> 190<span class="keyword">void</span><span class="special">*</span> <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">();</span> 191<span class="keyword">if</span> <span class="special">(</span><span class="identifier">except</span><span class="special">)</span> <span class="special">{</span> 192 <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> 193<span class="special">}</span> 194<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> 195 <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="identifier">vp</span><span class="special">));</span> 196 <span class="identifier">vp</span> <span class="special">=</span> <span class="identifier">source</span><span class="special">();</span> 197 <span class="keyword">if</span> <span class="special">(</span><span class="identifier">except</span><span class="special">)</span> <span class="special">{</span> 198 <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> 199 <span class="special">}</span> 200<span class="special">}</span> 201 202<span class="identifier">output</span><span class="special">:</span> 203 <span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span> 204 <span class="identifier">Parsed</span><span class="special">:</span> <span class="special">+</span> 205 <span class="identifier">Parsed</span><span class="special">:</span> <span class="number">1</span> 206</pre> 207<p> 208 In this example a recursive descent parser uses a callback to emit a newly 209 passed symbol. Using <span class="emphasis"><em>execution_context</em></span> the control flow 210 can be inverted, e.g. the user-code pulls parsed symbols from the parser - 211 instead to get pushed from the parser (via callback). 212 </p> 213<p> 214 The data (character) is transferred between the two <span class="emphasis"><em>execution_context</em></span>. 215 </p> 216<p> 217 If the code executed by <span class="emphasis"><em>execution_context</em></span> emits an exception, 218 the application is terminated. <span class="emphasis"><em>std::exception_ptr</em></span> can 219 be used to transfer exceptions between different execution contexts. 220 </p> 221<h4> 222<a name="context.ecv1.h2"></a> 223 <span><a name="context.ecv1.stack_unwinding"></a></span><a class="link" href="ecv1.html#context.ecv1.stack_unwinding">stack 224 unwinding</a> 225 </h4> 226<p> 227 Sometimes it is necessary to unwind the stack of an unfinished context to destroy 228 local stack variables so they can release allocated resources (RAII pattern). 229 The user is responsible for this task. 230 </p> 231<a name="ecv1_prealloc"></a><h4> 232<a name="context.ecv1.h3"></a> 233 <span><a name="context.ecv1.allocating_control_structures_on_top_of_stack"></a></span><a class="link" href="ecv1.html#context.ecv1.allocating_control_structures_on_top_of_stack">allocating 234 control structures on top of stack</a> 235 </h4> 236<p> 237 Allocating control structures on top of the stack requires to allocated the 238 <span class="emphasis"><em>stack_context</em></span> and create the control structure with placement 239 new before <span class="emphasis"><em>execution_context</em></span> is created. 240 </p> 241<div class="note"><table border="0" summary="Note"> 242<tr> 243<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td> 244<th align="left">Note</th> 245</tr> 246<tr><td align="left" valign="top"><p> 247 The user is responsible for destructing the control structure at the top 248 of the stack. 249 </p></td></tr> 250</table></div> 251<pre class="programlisting"><span class="comment">// stack-allocator used for (de-)allocating stack</span> 252<span class="identifier">fixedsize_stack</span> <span class="identifier">salloc</span><span class="special">(</span> <span class="number">4048</span><span class="special">);</span> 253<span class="comment">// allocate stack space</span> 254<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> 255<span class="comment">// reserve space for control structure on top of the stack</span> 256<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> 257<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> 258<span class="comment">// placement new creates control structure on reserved space</span> 259<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> 260<span class="special">...</span> 261<span class="comment">// destructing the control structure</span> 262<span class="identifier">cs</span><span class="special">->~</span><span class="identifier">my_control_structure</span><span class="special">();</span> 263<span class="special">...</span> 264<span class="keyword">struct</span> <span class="identifier">my_control_structure</span> <span class="special">{</span> 265 <span class="comment">// execution context</span> 266 <span class="identifier">execution_context</span> <span class="identifier">ectx</span><span class="special">;</span> 267 268 <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">StackAllocator</span> <span class="special">></span> 269 <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> 270 <span class="comment">// create execution context</span> 271 <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> 272 <span class="special">}</span> 273 <span class="special">...</span> 274<span class="special">};</span> 275</pre> 276<h4> 277<a name="context.ecv1.h4"></a> 278 <span><a name="context.ecv1.exception_handling"></a></span><a class="link" href="ecv1.html#context.ecv1.exception_handling">exception 279 handling</a> 280 </h4> 281<p> 282 If the function executed inside a <span class="emphasis"><em>execution_context</em></span> emits 283 ans exception, the application is terminated by calling <span class="emphasis"><em>std::terminate()</em></span>. 284 <span class="emphasis"><em>std::exception_ptr</em></span> can be used to transfer exceptions 285 between different execution contexts. 286 </p> 287<div class="important"><table border="0" summary="Important"> 288<tr> 289<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../doc/src/images/important.png"></td> 290<th align="left">Important</th> 291</tr> 292<tr><td align="left" valign="top"><p> 293 Do not jump from inside a catch block and then re-throw the exception in 294 another execution context. 295 </p></td></tr> 296</table></div> 297<h4> 298<a name="context.ecv1.h5"></a> 299 <span><a name="context.ecv1.parameter_passing"></a></span><a class="link" href="ecv1.html#context.ecv1.parameter_passing">parameter 300 passing</a> 301 </h4> 302<p> 303 The void pointer argument passed to <span class="emphasis"><em>execution_context::operator()</em></span>, 304 in one context, is passed as the last argument of the <span class="emphasis"><em>context-function</em></span> 305 if the context is started for the first time. In all following invocations 306 of <span class="emphasis"><em>execution_context::operator()</em></span> the void pointer passed 307 to <span class="emphasis"><em>execution_context::operator()</em></span>, in one context, is returned 308 by <span class="emphasis"><em>execution_context::operator()</em></span> in the other context. 309 </p> 310<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">X</span> <span class="special">{</span> 311<span class="keyword">private</span><span class="special">:</span> 312 <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception_ptr</span> <span class="identifier">excptr_</span><span class="special">;</span> 313 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">caller_</span><span class="special">;</span> 314 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">v1</span><span class="special">::</span><span class="identifier">execution_context</span> <span class="identifier">callee_</span><span class="special">;</span> 315 316<span class="keyword">public</span><span class="special">:</span> 317 <span class="identifier">X</span><span class="special">()</span> <span class="special">:</span> 318 <span class="identifier">excptr_</span><span class="special">(),</span> 319 <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">v1</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> 320 <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> 321 <span class="keyword">try</span> <span class="special">{</span> 322 <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> 323 <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> 324 <span class="identifier">caller_</span><span class="special">(</span> <span class="special">&</span> <span class="identifier">str</span><span class="special">);</span> 325 <span class="special">}</span> <span class="keyword">catch</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_cast</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">{</span> 326 <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> 327 <span class="special">}</span> 328 <span class="special">})</span> 329 <span class="special">{}</span> 330 331 <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> 332 <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> 333 <span class="keyword">if</span><span class="special">(</span><span class="identifier">excptr_</span><span class="special">){</span> 334 <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> 335 <span class="special">}</span> 336 <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> 337 <span class="special">}</span> 338<span class="special">};</span> 339 340<span class="identifier">X</span> <span class="identifier">x</span><span class="special">;</span> 341<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> 342 343<span class="identifier">output</span><span class="special">:</span> 344 <span class="number">7</span> 345</pre> 346<h4> 347<a name="context.ecv1.h6"></a> 348 <span><a name="context.ecv1.class__code__phrase_role__identifier__execution_context__phrase___code_"></a></span><a class="link" href="ecv1.html#context.ecv1.class__code__phrase_role__identifier__execution_context__phrase___code_">Class 349 <code class="computeroutput"><span class="identifier">execution_context</span></code></a> 350 </h4> 351<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">execution_context</span> <span class="special">{</span> 352<span class="keyword">public</span><span class="special">:</span> 353 <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> 354 355 <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> 356 <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> 357 358 <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> 359 <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> 360 361 <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> 362 <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> 363 364 <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> 365 <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> 366 367 <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> 368 <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> 369 370 <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> 371 <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> 372 373 <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> 374 375 <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">Fn</span> <span class="special">></span> 376 <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="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> 377 378 <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> 379 380 <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> 381 382 <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> 383 384 <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> 385 386 <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> 387 388 <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> 389 390 <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> 391 <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> 392 <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> 393<span class="special">};</span> 394</pre> 395<p> 396 </p> 397<h5> 398<a name="ecv1_current_bridgehead"></a> 399 <span><a name="ecv1_current"></a></span> 400 <a class="link" href="ecv1.html#ecv1_current">Static member function <code class="computeroutput">current</code>()</a> 401</h5> 402<p> 403 </p> 404<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> 405</pre> 406<div class="variablelist"> 407<p class="title"><b></b></p> 408<dl> 409<dt><span class="term">Returns:</span></dt> 410<dd><p> 411 Returns an instance of excution_context pointing to the active execution 412 context. 413 </p></dd> 414<dt><span class="term">Throws:</span></dt> 415<dd><p> 416 Nothing. 417 </p></dd> 418</dl> 419</div> 420<p> 421 </p> 422<h5> 423<a name="ecv1_constructor_bridgehead"></a> 424 <span><a name="ecv1_constructor"></a></span> 425 <a class="link" href="ecv1.html#ecv1_constructor">Constructor</a> 426</h5> 427<p> 428 </p> 429<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> 430<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> 431 432<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> 433<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> 434 435<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> 436<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> 437</pre> 438<div class="variablelist"> 439<p class="title"><b></b></p> 440<dl> 441<dt><span class="term">Effects:</span></dt> 442<dd><p> 443 Creates a new execution context and prepares the context to execute 444 <code class="computeroutput"><span class="identifier">fn</span></code>. <code class="computeroutput"><span class="identifier">fixedsize_stack</span></code> 445 is used as default stack allocator (stack size == fixedsize_stack::traits::default_size()). 446 The constructor with argument type <code class="computeroutput"><span class="identifier">preallocated</span></code>, 447 is used to create a user defined data <a class="link" href="ecv1.html#ecv1_prealloc">(for 448 instance additional control structures)</a> on top of the stack. 449 </p></dd> 450</dl> 451</div> 452<p> 453 </p> 454<h5> 455<a name="ecv1_copy%20constructor_bridgehead"></a> 456 <span><a name="ecv1_copy%20constructor"></a></span> 457 <a class="link" href="ecv1.html#ecv1_copy%20constructor">Copy 458 constructor</a> 459</h5> 460<p> 461 </p> 462<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> 463</pre> 464<div class="variablelist"> 465<p class="title"><b></b></p> 466<dl> 467<dt><span class="term">Effects:</span></dt> 468<dd><p> 469 Copies <code class="computeroutput"><span class="identifier">other</span></code>, e.g. underlying 470 control structure is shared with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 471 </p></dd> 472<dt><span class="term">Throws:</span></dt> 473<dd><p> 474 Nothing. 475 </p></dd> 476</dl> 477</div> 478<p> 479 </p> 480<h5> 481<a name="ecv1_move%20constructor_bridgehead"></a> 482 <span><a name="ecv1_move%20constructor"></a></span> 483 <a class="link" href="ecv1.html#ecv1_move%20constructor">Move 484 constructor</a> 485</h5> 486<p> 487 </p> 488<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> 489</pre> 490<div class="variablelist"> 491<p class="title"><b></b></p> 492<dl> 493<dt><span class="term">Effects:</span></dt> 494<dd><p> 495 Moves underlying control structure to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>. 496 </p></dd> 497<dt><span class="term">Throws:</span></dt> 498<dd><p> 499 Nothing. 500 </p></dd> 501</dl> 502</div> 503<p> 504 </p> 505<h5> 506<a name="ecv1_copy%20assignment_bridgehead"></a> 507 <span><a name="ecv1_copy%20assignment"></a></span> 508 <a class="link" href="ecv1.html#ecv1_copy%20assignment">Copy 509 assignment operator</a> 510</h5> 511<p> 512 </p> 513<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> 514</pre> 515<div class="variablelist"> 516<p class="title"><b></b></p> 517<dl> 518<dt><span class="term">Effects:</span></dt> 519<dd><p> 520 Copies the state of <code class="computeroutput"><span class="identifier">other</span></code> 521 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>, 522 control structure is shared. 523 </p></dd> 524<dt><span class="term">Throws:</span></dt> 525<dd><p> 526 Nothing. 527 </p></dd> 528</dl> 529</div> 530<p> 531 </p> 532<h5> 533<a name="ecv1_move%20assignment_bridgehead"></a> 534 <span><a name="ecv1_move%20assignment"></a></span> 535 <a class="link" href="ecv1.html#ecv1_move%20assignment">Move 536 assignment operator</a> 537</h5> 538<p> 539 </p> 540<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> 541</pre> 542<div class="variablelist"> 543<p class="title"><b></b></p> 544<dl> 545<dt><span class="term">Effects:</span></dt> 546<dd><p> 547 Moves the control structure of <code class="computeroutput"><span class="identifier">other</span></code> 548 to <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 549 using move semantics. 550 </p></dd> 551<dt><span class="term">Throws:</span></dt> 552<dd><p> 553 Nothing. 554 </p></dd> 555</dl> 556</div> 557<p> 558 </p> 559<h5> 560<a name="ecv1_operator_bool_bridgehead"></a> 561 <span><a name="ecv1_operator_bool"></a></span> 562 <a class="link" href="ecv1.html#ecv1_operator_bool">Member function 563 <code class="computeroutput">operator bool</code>()</a> 564</h5> 565<p> 566 </p> 567<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> 568</pre> 569<div class="variablelist"> 570<p class="title"><b></b></p> 571<dl> 572<dt><span class="term">Returns:</span></dt> 573<dd><p> 574 <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 control structure. 575 </p></dd> 576<dt><span class="term">Throws:</span></dt> 577<dd><p> 578 Nothing. 579 </p></dd> 580</dl> 581</div> 582<p> 583 </p> 584<h5> 585<a name="ecv1_operator_not_bridgehead"></a> 586 <span><a name="ecv1_operator_not"></a></span> 587 <a class="link" href="ecv1.html#ecv1_operator_not">Member function 588 <code class="computeroutput">operator!</code>()</a> 589</h5> 590<p> 591 </p> 592<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> 593</pre> 594<div class="variablelist"> 595<p class="title"><b></b></p> 596<dl> 597<dt><span class="term">Returns:</span></dt> 598<dd><p> 599 <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 control structure. 600 </p></dd> 601<dt><span class="term">Throws:</span></dt> 602<dd><p> 603 Nothing. 604 </p></dd> 605</dl> 606</div> 607<p> 608 </p> 609<h5> 610<a name="ecv1_operator_call_bridgehead"></a> 611 <span><a name="ecv1_operator_call"></a></span> 612 <a class="link" href="ecv1.html#ecv1_operator_call">Member function 613 <code class="computeroutput">operator()</code>()</a> 614</h5> 615<p> 616 </p> 617<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> 618</pre> 619<div class="variablelist"> 620<p class="title"><b></b></p> 621<dl> 622<dt><span class="term">Effects:</span></dt> 623<dd><p> 624 Stores internally the current context data (stack pointer, instruction 625 pointer, and CPU registers) of the current active context and restores 626 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 627 context. The void pointer argument, <code class="computeroutput"><span class="identifier">vp</span></code>, 628 is passed to the current context to be returned by the most recent call 629 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> 630 is executed with arguments <code class="computeroutput"><span class="identifier">args</span></code> 631 on top of the stack of <code class="computeroutput"><span class="keyword">this</span></code>. 632 </p></dd> 633<dt><span class="term">Note:</span></dt> 634<dd><p> 635 The behaviour is undefined if <code class="computeroutput"><span class="keyword">operator</span><span class="special">()()</span></code> is called while <span class="emphasis"><em>execution_context::current()</em></span> 636 returns <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 637 (e.g. resuming an already running context). If the top-level context 638 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. 639 </p></dd> 640<dt><span class="term">Returns:</span></dt> 641<dd><p> 642 The void pointer argument passed to the most recent call to <span class="emphasis"><em>execution_context::operator()</em></span>, 643 if any. 644 </p></dd> 645</dl> 646</div> 647<p> 648 </p> 649<h5> 650<a name="ecv1_operator_call_ontop_bridgehead"></a> 651 <span><a name="ecv1_operator_call_ontop"></a></span> 652 <a class="link" href="ecv1.html#ecv1_operator_call_ontop">Member 653 function <code class="computeroutput">operator(exec_ontop_arg_t)</code>()</a> 654</h5> 655<p> 656 </p> 657<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> 658<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="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> 659</pre> 660<div class="variablelist"> 661<p class="title"><b></b></p> 662<dl> 663<dt><span class="term">Effects:</span></dt> 664<dd><p> 665 Same as <span class="emphasis"><em>execution_context::operator()</em></span>. Additionally, 666 function <code class="computeroutput"><span class="identifier">fn</span></code> is executed 667 with arguments <code class="computeroutput"><span class="identifier">vp</span></code> in 668 the context of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 669 (e.g. the stack frame of <code class="computeroutput"><span class="identifier">fn</span></code> 670 is allocated on stack of <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>). 671 </p></dd> 672<dt><span class="term">Returns:</span></dt> 673<dd><p> 674 The void pointer argument passed to the most recent call to <span class="emphasis"><em>execution_context::operator()</em></span>, 675 if any. 676 </p></dd> 677</dl> 678</div> 679<p> 680 </p> 681<h5> 682<a name="ecv1_operator_equal_bridgehead"></a> 683 <span><a name="ecv1_operator_equal"></a></span> 684 <a class="link" href="ecv1.html#ecv1_operator_equal">Member 685 function <code class="computeroutput">operator==</code>()</a> 686</h5> 687<p> 688 </p> 689<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> 690</pre> 691<div class="variablelist"> 692<p class="title"><b></b></p> 693<dl> 694<dt><span class="term">Returns:</span></dt> 695<dd><p> 696 <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> 697 represent the same execution context, <code class="computeroutput"><span class="keyword">false</span></code> 698 otherwise. 699 </p></dd> 700<dt><span class="term">Throws:</span></dt> 701<dd><p> 702 Nothing. 703 </p></dd> 704</dl> 705</div> 706<p> 707 </p> 708<h5> 709<a name="ecv1_operator_notequal_bridgehead"></a> 710 <span><a name="ecv1_operator_notequal"></a></span> 711 <a class="link" href="ecv1.html#ecv1_operator_notequal">Member 712 function <code class="computeroutput">operator!=</code>()</a> 713</h5> 714<p> 715 </p> 716<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> 717</pre> 718<div class="variablelist"> 719<p class="title"><b></b></p> 720<dl> 721<dt><span class="term">Returns:</span></dt> 722<dd><p> 723 <code class="computeroutput">! (other == * this)</code> 724 </p></dd> 725<dt><span class="term">Throws:</span></dt> 726<dd><p> 727 Nothing. 728 </p></dd> 729</dl> 730</div> 731<p> 732 </p> 733<h5> 734<a name="ecv1_operator_less_bridgehead"></a> 735 <span><a name="ecv1_operator_less"></a></span> 736 <a class="link" href="ecv1.html#ecv1_operator_less">Member function 737 <code class="computeroutput">operator<</code>()</a> 738</h5> 739<p> 740 </p> 741<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> 742</pre> 743<div class="variablelist"> 744<p class="title"><b></b></p> 745<dl> 746<dt><span class="term">Returns:</span></dt> 747<dd><p> 748 <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 749 total order of <code class="computeroutput"><span class="identifier">execution_context</span></code> 750 values places <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 751 before <code class="computeroutput"><span class="identifier">other</span></code>, false otherwise. 752 </p></dd> 753<dt><span class="term">Throws:</span></dt> 754<dd><p> 755 Nothing. 756 </p></dd> 757</dl> 758</div> 759<p> 760 </p> 761<h5> 762<a name="ecv1_operator_greater_bridgehead"></a> 763 <span><a name="ecv1_operator_greater"></a></span> 764 <a class="link" href="ecv1.html#ecv1_operator_greater">Member 765 function <code class="computeroutput">operator></code>()</a> 766</h5> 767<p> 768 </p> 769<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> 770</pre> 771<div class="variablelist"> 772<p class="title"><b></b></p> 773<dl> 774<dt><span class="term">Returns:</span></dt> 775<dd><p> 776 <code class="computeroutput"><span class="identifier">other</span> <span class="special"><</span> 777 <span class="special">*</span> <span class="keyword">this</span></code> 778 </p></dd> 779<dt><span class="term">Throws:</span></dt> 780<dd><p> 781 Nothing. 782 </p></dd> 783</dl> 784</div> 785<p> 786 </p> 787<h5> 788<a name="ecv1_operator_lesseq_bridgehead"></a> 789 <span><a name="ecv1_operator_lesseq"></a></span> 790 <a class="link" href="ecv1.html#ecv1_operator_lesseq">Member 791 function <code class="computeroutput">operator<=</code>()</a> 792</h5> 793<p> 794 </p> 795<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> 796</pre> 797<div class="variablelist"> 798<p class="title"><b></b></p> 799<dl> 800<dt><span class="term">Returns:</span></dt> 801<dd><p> 802 <code class="computeroutput"><span class="special">!</span> <span class="special">(</span><span class="identifier">other</span> <span class="special"><</span> 803 <span class="special">*</span> <span class="keyword">this</span><span class="special">)</span></code> 804 </p></dd> 805<dt><span class="term">Throws:</span></dt> 806<dd><p> 807 Nothing. 808 </p></dd> 809</dl> 810</div> 811<p> 812 </p> 813<h5> 814<a name="ecv1_operator_greatereq_bridgehead"></a> 815 <span><a name="ecv1_operator_greatereq"></a></span> 816 <a class="link" href="ecv1.html#ecv1_operator_greatereq">Member 817 function <code class="computeroutput">operator>=</code>()</a> 818</h5> 819<p> 820 </p> 821<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> 822</pre> 823<div class="variablelist"> 824<p class="title"><b></b></p> 825<dl> 826<dt><span class="term">Returns:</span></dt> 827<dd><p> 828 <code class="computeroutput"><span class="special">!</span> <span class="special">(*</span> 829 <span class="keyword">this</span> <span class="special"><</span> 830 <span class="identifier">other</span><span class="special">)</span></code> 831 </p></dd> 832<dt><span class="term">Throws:</span></dt> 833<dd><p> 834 Nothing. 835 </p></dd> 836</dl> 837</div> 838<p> 839 </p> 840<h5> 841<a name="ecv1__bridgehead"></a> 842 <span><a name="ecv1_"></a></span> 843 <a class="link" href="ecv1.html#ecv1_">Non-member function <code class="computeroutput">operator<<()</code></a> 844</h5> 845<p> 846 </p> 847<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> 848<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> 849<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> 850</pre> 851<div class="variablelist"> 852<p class="title"><b></b></p> 853<dl> 854<dt><span class="term">Efects:</span></dt> 855<dd><p> 856 Writes the representation of <code class="computeroutput"><span class="identifier">other</span></code> 857 to stream <code class="computeroutput"><span class="identifier">os</span></code>. 858 </p></dd> 859<dt><span class="term">Returns:</span></dt> 860<dd><p> 861 <code class="computeroutput"><span class="identifier">os</span></code> 862 </p></dd> 863</dl> 864</div> 865</div> 866<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 867<td align="left"></td> 868<td align="right"><div class="copyright-footer">Copyright © 2014 Oliver Kowalke<p> 869 Distributed under the Boost Software License, Version 1.0. (See accompanying 870 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>) 871 </p> 872</div></td> 873</tr></table> 874<hr> 875<div class="spirit-nav"> 876<a accesskey="p" href="ecv2.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> 877</div> 878</body> 879</html> 880