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