Imported Upstream version 1.64.0
[platform/upstream/boost.git] / libs / fiber / doc / html / fiber / scheduling.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Scheduling</title>
5 <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../index.html" title="Chapter&#160;1.&#160;Fiber">
8 <link rel="up" href="../index.html" title="Chapter&#160;1.&#160;Fiber">
9 <link rel="prev" href="fiber_mgmt/this_fiber.html" title="Namespace this_fiber">
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="fiber_mgmt/this_fiber.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="fiber.scheduling"></a><a name="scheduling"></a><a class="link" href="scheduling.html" title="Scheduling">Scheduling</a>
28 </h2></div></div></div>
29 <p>
30       The fibers in a thread are coordinated by a fiber manager. Fibers trade control
31       cooperatively, rather than preemptively: the currently-running fiber retains
32       control until it invokes some operation that passes control to the manager.
33       Each time a fiber suspends (or yields), the fiber manager consults a scheduler
34       to determine which fiber will run next.
35     </p>
36 <p>
37       <span class="bold"><strong>Boost.Fiber</strong></span> provides the fiber manager, but
38       the scheduler is a customization point. (See <a class="link" href="custom.html#custom">Customization</a>.)
39     </p>
40 <p>
41       Each thread has its own scheduler. Different threads in a process may use different
42       schedulers. By default, <span class="bold"><strong>Boost.Fiber</strong></span> implicitly
43       instantiates <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a> as the scheduler for each thread.
44     </p>
45 <p>
46       You are explicitly permitted to code your own <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> subclass.
47       For the most part, your <code class="computeroutput"><span class="identifier">algorithm</span></code>
48       subclass need not defend against cross-thread calls: the fiber manager intercepts
49       and defers such calls. Most <code class="computeroutput"><span class="identifier">algorithm</span></code>
50       methods are only ever directly called from the thread whose fibers it is managing
51       &#8212; with exceptions as documented below.
52     </p>
53 <p>
54       Your <code class="computeroutput"><span class="identifier">algorithm</span></code> subclass is
55       engaged on a particular thread by calling <a class="link" href="fiber_mgmt/fiber.html#use_scheduling_algorithm"><code class="computeroutput">use_scheduling_algorithm()</code></a>:
56     </p>
57 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">thread_fn</span><span class="special">()</span> <span class="special">{</span>
58     <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">use_scheduling_algorithm</span><span class="special">&lt;</span> <span class="identifier">my_fiber_scheduler</span> <span class="special">&gt;();</span>
59     <span class="special">...</span>
60 <span class="special">}</span>
61 </pre>
62 <p>
63       A scheduler class must implement interface <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>. <span class="bold"><strong>Boost.Fiber</strong></span> provides one scheduler: <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>.
64     </p>
65 <p>
66       </p>
67 <h5>
68 <a name="class_algorithm_bridgehead"></a>
69   <span class="phrase"><a name="class_algorithm"></a></span>
70   <a class="link" href="scheduling.html#class_algorithm">Class <code class="computeroutput">algorithm</code></a>
71 </h5>
72 <p>
73     </p>
74 <p>
75       <code class="computeroutput"><span class="identifier">algorithm</span></code> is the abstract base
76       class defining the interface that a fiber scheduler must implement.
77     </p>
78 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algo</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
79
80 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
81 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
82 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
83
84 <span class="keyword">struct</span> <span class="identifier">algorithm</span> <span class="special">{</span>
85     <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">algorithm</span><span class="special">();</span>
86
87     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
88
89     <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
90
91     <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
92
93     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
94
95     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
96 <span class="special">};</span>
97
98 <span class="special">}}}</span>
99 </pre>
100 <p>
101       </p>
102 <h5>
103 <a name="algorithm_awakened_bridgehead"></a>
104   <span class="phrase"><a name="algorithm_awakened"></a></span>
105   <a class="link" href="scheduling.html#algorithm_awakened">Member function
106       <code class="computeroutput">awakened</code>()</a>
107 </h5>
108 <p>
109     </p>
110 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
111 </pre>
112 <div class="variablelist">
113 <p class="title"><b></b></p>
114 <dl class="variablelist">
115 <dt><span class="term">Effects:</span></dt>
116 <dd><p>
117             Informs the scheduler that fiber <code class="computeroutput"><span class="identifier">f</span></code>
118             is ready to run. Fiber <code class="computeroutput"><span class="identifier">f</span></code>
119             might be newly launched, or it might have been blocked but has just been
120             awakened, or it might have called <a class="link" href="fiber_mgmt/this_fiber.html#this_fiber_yield"><code class="computeroutput">this_fiber::yield()</code></a>.
121           </p></dd>
122 <dt><span class="term">Note:</span></dt>
123 <dd><p>
124             This method advises the scheduler to add fiber <code class="computeroutput"><span class="identifier">f</span></code>
125             to its collection of fibers ready to run. A typical scheduler implementation
126             places <code class="computeroutput"><span class="identifier">f</span></code> into a queue.
127           </p></dd>
128 <dt><span class="term">See also:</span></dt>
129 <dd><p>
130             <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>
131           </p></dd>
132 </dl>
133 </div>
134 <p>
135       </p>
136 <h5>
137 <a name="algorithm_pick_next_bridgehead"></a>
138   <span class="phrase"><a name="algorithm_pick_next"></a></span>
139   <a class="link" href="scheduling.html#algorithm_pick_next">Member
140       function <code class="computeroutput">pick_next</code>()</a>
141 </h5>
142 <p>
143     </p>
144 <pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
145 </pre>
146 <div class="variablelist">
147 <p class="title"><b></b></p>
148 <dl class="variablelist">
149 <dt><span class="term">Returns:</span></dt>
150 <dd><p>
151             the fiber which is to be resumed next, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
152             if there is no ready fiber.
153           </p></dd>
154 <dt><span class="term">Note:</span></dt>
155 <dd><p>
156             This is where the scheduler actually specifies the fiber which is to
157             run next. A typical scheduler implementation chooses the head of the
158             ready queue.
159           </p></dd>
160 <dt><span class="term">See also:</span></dt>
161 <dd><p>
162             <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>
163           </p></dd>
164 </dl>
165 </div>
166 <p>
167       </p>
168 <h5>
169 <a name="algorithm_has_ready_fibers_bridgehead"></a>
170   <span class="phrase"><a name="algorithm_has_ready_fibers"></a></span>
171   <a class="link" href="scheduling.html#algorithm_has_ready_fibers">Member
172       function <code class="computeroutput">has_ready_fibers</code>()</a>
173 </h5>
174 <p>
175     </p>
176 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
177 </pre>
178 <div class="variablelist">
179 <p class="title"><b></b></p>
180 <dl class="variablelist">
181 <dt><span class="term">Returns:</span></dt>
182 <dd><p>
183             <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
184             ready to run.
185           </p></dd>
186 </dl>
187 </div>
188 <p>
189       </p>
190 <h5>
191 <a name="algorithm_suspend_until_bridgehead"></a>
192   <span class="phrase"><a name="algorithm_suspend_until"></a></span>
193   <a class="link" href="scheduling.html#algorithm_suspend_until">Member
194       function <code class="computeroutput">suspend_until</code>()</a>
195 </h5>
196 <p>
197     </p>
198 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
199 </pre>
200 <div class="variablelist">
201 <p class="title"><b></b></p>
202 <dl class="variablelist">
203 <dt><span class="term">Effects:</span></dt>
204 <dd><p>
205             Informs the scheduler that no fiber will be ready until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
206           </p></dd>
207 <dt><span class="term">Note:</span></dt>
208 <dd><p>
209             This method allows a custom scheduler to yield control to the containing
210             environment in whatever way makes sense. The fiber manager is stating
211             that <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code>
212             need not return until <code class="computeroutput"><span class="identifier">abs_time</span></code>
213             &#8212; or <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a> is called &#8212; whichever comes first.
214             The interaction with <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> means that, for instance, calling
215             <a href="http://en.cppreference.com/w/cpp/thread/sleep_until" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
216             would be too simplistic. <a class="link" href="scheduling.html#round_robin_suspend_until"><code class="computeroutput">round_robin::suspend_until()</code></a> uses
217             a <a href="http://en.cppreference.com/w/cpp/thread/condition_variable" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span></code></a> to coordinate
218             with <a class="link" href="scheduling.html#round_robin_notify"><code class="computeroutput">round_robin::notify()</code></a>.
219           </p></dd>
220 <dt><span class="term">Note:</span></dt>
221 <dd><p>
222             Given that <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
223             might be called from another thread, your <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code> implementation &#8212; like the rest of your
224             <code class="computeroutput"><span class="identifier">algorithm</span></code> implementation
225             &#8212; must guard any data it shares with your <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> implementation.
226           </p></dd>
227 </dl>
228 </div>
229 <p>
230       </p>
231 <h5>
232 <a name="algorithm_notify_bridgehead"></a>
233   <span class="phrase"><a name="algorithm_notify"></a></span>
234   <a class="link" href="scheduling.html#algorithm_notify">Member function
235       <code class="computeroutput">notify</code>()</a>
236 </h5>
237 <p>
238     </p>
239 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
240 </pre>
241 <div class="variablelist">
242 <p class="title"><b></b></p>
243 <dl class="variablelist">
244 <dt><span class="term">Effects:</span></dt>
245 <dd><p>
246             Requests the scheduler to return from a pending call to <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>.
247           </p></dd>
248 <dt><span class="term">Note:</span></dt>
249 <dd><p>
250             Alone among the <code class="computeroutput"><span class="identifier">algorithm</span></code>
251             methods, <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
252             may be called from another thread. Your <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> implementation must guard any data
253             it shares with the rest of your <code class="computeroutput"><span class="identifier">algorithm</span></code>
254             implementation.
255           </p></dd>
256 </dl>
257 </div>
258 <p>
259       </p>
260 <h5>
261 <a name="class_round_robin_bridgehead"></a>
262   <span class="phrase"><a name="class_round_robin"></a></span>
263   <a class="link" href="scheduling.html#class_round_robin">Class <code class="computeroutput">round_robin</code></a>
264 </h5>
265 <p>
266     </p>
267 <p>
268       This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>, scheduling fibers in round-robin
269       fashion.
270     </p>
271 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algo</span><span class="special">/</span><span class="identifier">round_robin</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
272
273 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
274 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
275 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
276
277 <span class="keyword">class</span> <span class="identifier">round_robin</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">algorithm</span> <span class="special">{</span>
278     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
279
280     <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
281
282     <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
283
284     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
285
286     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
287 <span class="special">};</span>
288
289 <span class="special">}}}</span>
290 </pre>
291 <p>
292       </p>
293 <h5>
294 <a name="round_robin_awakened_bridgehead"></a>
295   <span class="phrase"><a name="round_robin_awakened"></a></span>
296   <a class="link" href="scheduling.html#round_robin_awakened">Member
297       function <code class="computeroutput">awakened</code>()</a>
298 </h5>
299 <p>
300     </p>
301 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
302 </pre>
303 <div class="variablelist">
304 <p class="title"><b></b></p>
305 <dl class="variablelist">
306 <dt><span class="term">Effects:</span></dt>
307 <dd><p>
308             Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
309             a ready queue.
310           </p></dd>
311 <dt><span class="term">Throws:</span></dt>
312 <dd><p>
313             Nothing.
314           </p></dd>
315 </dl>
316 </div>
317 <p>
318       </p>
319 <h5>
320 <a name="round_robin_pick_next_bridgehead"></a>
321   <span class="phrase"><a name="round_robin_pick_next"></a></span>
322   <a class="link" href="scheduling.html#round_robin_pick_next">Member
323       function <code class="computeroutput">pick_next</code>()</a>
324 </h5>
325 <p>
326     </p>
327 <pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
328 </pre>
329 <div class="variablelist">
330 <p class="title"><b></b></p>
331 <dl class="variablelist">
332 <dt><span class="term">Returns:</span></dt>
333 <dd><p>
334             the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
335             if the queue is empty.
336           </p></dd>
337 <dt><span class="term">Throws:</span></dt>
338 <dd><p>
339             Nothing.
340           </p></dd>
341 <dt><span class="term">Note:</span></dt>
342 <dd><p>
343             Placing ready fibers onto the tail of a queue, and returning them from
344             the head of that queue, shares the thread between ready fibers in round-robin
345             fashion.
346           </p></dd>
347 </dl>
348 </div>
349 <p>
350       </p>
351 <h5>
352 <a name="round_robin_has_ready_fibers_bridgehead"></a>
353   <span class="phrase"><a name="round_robin_has_ready_fibers"></a></span>
354   <a class="link" href="scheduling.html#round_robin_has_ready_fibers">Member
355       function <code class="computeroutput">has_ready_fibers</code>()</a>
356 </h5>
357 <p>
358     </p>
359 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
360 </pre>
361 <div class="variablelist">
362 <p class="title"><b></b></p>
363 <dl class="variablelist">
364 <dt><span class="term">Returns:</span></dt>
365 <dd><p>
366             <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
367             ready to run.
368           </p></dd>
369 <dt><span class="term">Throws:</span></dt>
370 <dd><p>
371             Nothing.
372           </p></dd>
373 </dl>
374 </div>
375 <p>
376       </p>
377 <h5>
378 <a name="round_robin_suspend_until_bridgehead"></a>
379   <span class="phrase"><a name="round_robin_suspend_until"></a></span>
380   <a class="link" href="scheduling.html#round_robin_suspend_until">Member
381       function <code class="computeroutput">suspend_until</code>()</a>
382 </h5>
383 <p>
384     </p>
385 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
386 </pre>
387 <div class="variablelist">
388 <p class="title"><b></b></p>
389 <dl class="variablelist">
390 <dt><span class="term">Effects:</span></dt>
391 <dd><p>
392             Informs <code class="computeroutput"><span class="identifier">round_robin</span></code> that
393             no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
394             This implementation blocks in <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">wait_until</span><span class="special">()</span></code></a>.
395           </p></dd>
396 <dt><span class="term">Throws:</span></dt>
397 <dd><p>
398             Nothing.
399           </p></dd>
400 </dl>
401 </div>
402 <p>
403       </p>
404 <h5>
405 <a name="round_robin_notify_bridgehead"></a>
406   <span class="phrase"><a name="round_robin_notify"></a></span>
407   <a class="link" href="scheduling.html#round_robin_notify">Member function
408       <code class="computeroutput">notify</code>()</a>
409 </h5>
410 <p>
411     </p>
412 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
413 </pre>
414 <div class="variablelist">
415 <p class="title"><b></b></p>
416 <dl class="variablelist">
417 <dt><span class="term">Effects:</span></dt>
418 <dd><p>
419             Wake up a pending call to <a class="link" href="scheduling.html#round_robin_suspend_until"><code class="computeroutput">round_robin::suspend_until()</code></a>,
420             some fibers might be ready. This implementation wakes <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code> via <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">notify_all</span><span class="special">()</span></code></a>.
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="class_shared_work_bridgehead"></a>
432   <span class="phrase"><a name="class_shared_work"></a></span>
433   <a class="link" href="scheduling.html#class_shared_work">Class <code class="computeroutput">shared_work</code></a>
434 </h5>
435 <p>
436     </p>
437 <div class="note"><table border="0" summary="Note">
438 <tr>
439 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
440 <th align="left">Note</th>
441 </tr>
442 <tr><td align="left" valign="top"><p>
443         Because of the non-locality of data, <span class="emphasis"><em>shared_work</em></span> is
444         less performant than <span class="emphasis"><em>work_stealing</em></span>.
445       </p></td></tr>
446 </table></div>
447 <p>
448       This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>, scheduling fibers in round-robin
449       fashion. Ready fibers are shared between all instances (running on different
450       threads) of shared_work, thus the work is distributed equally over all threads.
451     </p>
452 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algo</span><span class="special">/</span><span class="identifier">shared_work</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
453
454 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
455 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
456 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
457
458 <span class="keyword">class</span> <span class="identifier">shared_work</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">algorithm</span> <span class="special">{</span>
459     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
460
461     <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
462
463     <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
464
465     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
466
467     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
468 <span class="special">};</span>
469
470 <span class="special">}}}</span>
471 </pre>
472 <p>
473       </p>
474 <h5>
475 <a name="shared_work_awakened_bridgehead"></a>
476   <span class="phrase"><a name="shared_work_awakened"></a></span>
477   <a class="link" href="scheduling.html#shared_work_awakened">Member
478       function <code class="computeroutput">awakened</code>()</a>
479 </h5>
480 <p>
481     </p>
482 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
483 </pre>
484 <div class="variablelist">
485 <p class="title"><b></b></p>
486 <dl class="variablelist">
487 <dt><span class="term">Effects:</span></dt>
488 <dd><p>
489             Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
490             the shared ready queue.
491           </p></dd>
492 <dt><span class="term">Throws:</span></dt>
493 <dd><p>
494             Nothing.
495           </p></dd>
496 </dl>
497 </div>
498 <p>
499       </p>
500 <h5>
501 <a name="shared_work_pick_next_bridgehead"></a>
502   <span class="phrase"><a name="shared_work_pick_next"></a></span>
503   <a class="link" href="scheduling.html#shared_work_pick_next">Member
504       function <code class="computeroutput">pick_next</code>()</a>
505 </h5>
506 <p>
507     </p>
508 <pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
509 </pre>
510 <div class="variablelist">
511 <p class="title"><b></b></p>
512 <dl class="variablelist">
513 <dt><span class="term">Returns:</span></dt>
514 <dd><p>
515             the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
516             if the queue is empty.
517           </p></dd>
518 <dt><span class="term">Throws:</span></dt>
519 <dd><p>
520             Nothing.
521           </p></dd>
522 <dt><span class="term">Note:</span></dt>
523 <dd><p>
524             Placing ready fibers onto the tail of the shared queue, and returning
525             them from the head of that queue, shares the thread between ready fibers
526             in round-robin fashion.
527           </p></dd>
528 </dl>
529 </div>
530 <p>
531       </p>
532 <h5>
533 <a name="shared_work_has_ready_fibers_bridgehead"></a>
534   <span class="phrase"><a name="shared_work_has_ready_fibers"></a></span>
535   <a class="link" href="scheduling.html#shared_work_has_ready_fibers">Member
536       function <code class="computeroutput">has_ready_fibers</code>()</a>
537 </h5>
538 <p>
539     </p>
540 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</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 class="variablelist">
545 <dt><span class="term">Returns:</span></dt>
546 <dd><p>
547             <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
548             ready to run.
549           </p></dd>
550 <dt><span class="term">Throws:</span></dt>
551 <dd><p>
552             Nothing.
553           </p></dd>
554 </dl>
555 </div>
556 <p>
557       </p>
558 <h5>
559 <a name="shared_work_suspend_until_bridgehead"></a>
560   <span class="phrase"><a name="shared_work_suspend_until"></a></span>
561   <a class="link" href="scheduling.html#shared_work_suspend_until">Member
562       function <code class="computeroutput">suspend_until</code>()</a>
563 </h5>
564 <p>
565     </p>
566 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
567 </pre>
568 <div class="variablelist">
569 <p class="title"><b></b></p>
570 <dl class="variablelist">
571 <dt><span class="term">Effects:</span></dt>
572 <dd><p>
573             Informs <code class="computeroutput"><span class="identifier">shared_work</span></code> that
574             no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
575             This implementation blocks in <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">wait_until</span><span class="special">()</span></code></a>.
576           </p></dd>
577 <dt><span class="term">Throws:</span></dt>
578 <dd><p>
579             Nothing.
580           </p></dd>
581 </dl>
582 </div>
583 <p>
584       </p>
585 <h5>
586 <a name="shared_work_notify_bridgehead"></a>
587   <span class="phrase"><a name="shared_work_notify"></a></span>
588   <a class="link" href="scheduling.html#shared_work_notify">Member function
589       <code class="computeroutput">notify</code>()</a>
590 </h5>
591 <p>
592     </p>
593 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
594 </pre>
595 <div class="variablelist">
596 <p class="title"><b></b></p>
597 <dl class="variablelist">
598 <dt><span class="term">Effects:</span></dt>
599 <dd><p>
600             Wake up a pending call to <a class="link" href="scheduling.html#shared_work_suspend_until"><code class="computeroutput">shared_work::suspend_until()</code></a>,
601             some fibers might be ready. This implementation wakes <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code> via <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">notify_all</span><span class="special">()</span></code></a>.
602           </p></dd>
603 <dt><span class="term">Throws:</span></dt>
604 <dd><p>
605             Nothing.
606           </p></dd>
607 </dl>
608 </div>
609 <p>
610       </p>
611 <h5>
612 <a name="class_work_stealing_bridgehead"></a>
613   <span class="phrase"><a name="class_work_stealing"></a></span>
614   <a class="link" href="scheduling.html#class_work_stealing">Class <code class="computeroutput">work_stealing</code></a>
615 </h5>
616 <p>
617     </p>
618 <p>
619       This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>; if the local ready-queue runs
620       out of ready fibers, ready fibers are stolen from other schedulers. The victim
621       scheduler (from which a ready fiber is stolen) is selected at random.
622     </p>
623 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algo</span><span class="special">/</span><span class="identifier">work_stealing</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
624
625 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
626 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
627 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
628
629 <span class="keyword">class</span> <span class="identifier">work_stealing</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">algorithm</span> <span class="special">{</span>
630     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
631
632     <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
633
634     <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
635
636     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
637
638     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
639 <span class="special">};</span>
640
641 <span class="special">}}}</span>
642 </pre>
643 <p>
644       </p>
645 <h5>
646 <a name="work_stealing_awakened_bridgehead"></a>
647   <span class="phrase"><a name="work_stealing_awakened"></a></span>
648   <a class="link" href="scheduling.html#work_stealing_awakened">Member
649       function <code class="computeroutput">awakened</code>()</a>
650 </h5>
651 <p>
652     </p>
653 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
654 </pre>
655 <div class="variablelist">
656 <p class="title"><b></b></p>
657 <dl class="variablelist">
658 <dt><span class="term">Effects:</span></dt>
659 <dd><p>
660             Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
661             the shared ready queue.
662           </p></dd>
663 <dt><span class="term">Throws:</span></dt>
664 <dd><p>
665             Nothing.
666           </p></dd>
667 </dl>
668 </div>
669 <p>
670       </p>
671 <h5>
672 <a name="work_stealing_pick_next_bridgehead"></a>
673   <span class="phrase"><a name="work_stealing_pick_next"></a></span>
674   <a class="link" href="scheduling.html#work_stealing_pick_next">Member
675       function <code class="computeroutput">pick_next</code>()</a>
676 </h5>
677 <p>
678     </p>
679 <pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
680 </pre>
681 <div class="variablelist">
682 <p class="title"><b></b></p>
683 <dl class="variablelist">
684 <dt><span class="term">Returns:</span></dt>
685 <dd><p>
686             the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
687             if the queue is empty.
688           </p></dd>
689 <dt><span class="term">Throws:</span></dt>
690 <dd><p>
691             Nothing.
692           </p></dd>
693 <dt><span class="term">Note:</span></dt>
694 <dd><p>
695             Placing ready fibers onto the tail of the sahred queue, and returning
696             them from the head of that queue, shares the thread between ready fibers
697             in round-robin fashion.
698           </p></dd>
699 </dl>
700 </div>
701 <p>
702       </p>
703 <h5>
704 <a name="work_stealing_has_ready_fibers_bridgehead"></a>
705   <span class="phrase"><a name="work_stealing_has_ready_fibers"></a></span>
706   <a class="link" href="scheduling.html#work_stealing_has_ready_fibers">Member
707       function <code class="computeroutput">has_ready_fibers</code>()</a>
708 </h5>
709 <p>
710     </p>
711 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
712 </pre>
713 <div class="variablelist">
714 <p class="title"><b></b></p>
715 <dl class="variablelist">
716 <dt><span class="term">Returns:</span></dt>
717 <dd><p>
718             <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
719             ready to run.
720           </p></dd>
721 <dt><span class="term">Throws:</span></dt>
722 <dd><p>
723             Nothing.
724           </p></dd>
725 </dl>
726 </div>
727 <p>
728       </p>
729 <h5>
730 <a name="work_stealing_suspend_until_bridgehead"></a>
731   <span class="phrase"><a name="work_stealing_suspend_until"></a></span>
732   <a class="link" href="scheduling.html#work_stealing_suspend_until">Member
733       function <code class="computeroutput">suspend_until</code>()</a>
734 </h5>
735 <p>
736     </p>
737 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
738 </pre>
739 <div class="variablelist">
740 <p class="title"><b></b></p>
741 <dl class="variablelist">
742 <dt><span class="term">Effects:</span></dt>
743 <dd><p>
744             Informs <code class="computeroutput"><span class="identifier">work_stealing</span></code>
745             that no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>. This implementation blocks
746             in <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">wait_until</span><span class="special">()</span></code></a>.
747           </p></dd>
748 <dt><span class="term">Throws:</span></dt>
749 <dd><p>
750             Nothing.
751           </p></dd>
752 </dl>
753 </div>
754 <p>
755       </p>
756 <h5>
757 <a name="work_stealing_notify_bridgehead"></a>
758   <span class="phrase"><a name="work_stealing_notify"></a></span>
759   <a class="link" href="scheduling.html#work_stealing_notify">Member
760       function <code class="computeroutput">notify</code>()</a>
761 </h5>
762 <p>
763     </p>
764 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
765 </pre>
766 <div class="variablelist">
767 <p class="title"><b></b></p>
768 <dl class="variablelist">
769 <dt><span class="term">Effects:</span></dt>
770 <dd><p>
771             Wake up a pending call to <a class="link" href="scheduling.html#work_stealing_suspend_until"><code class="computeroutput">work_stealing::suspend_until()</code></a>,
772             some fibers might be ready. This implementation wakes <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code> via <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">notify_all</span><span class="special">()</span></code></a>.
773           </p></dd>
774 <dt><span class="term">Throws:</span></dt>
775 <dd><p>
776             Nothing.
777           </p></dd>
778 </dl>
779 </div>
780 <h4>
781 <a name="fiber.scheduling.h0"></a>
782       <span class="phrase"><a name="fiber.scheduling.custom_scheduler_fiber_properties"></a></span><a class="link" href="scheduling.html#fiber.scheduling.custom_scheduler_fiber_properties">Custom
783       Scheduler Fiber Properties</a>
784     </h4>
785 <p>
786       A scheduler class directly derived from <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> can use any
787       information available from <a class="link" href="scheduling.html#class_context"><code class="computeroutput">context</code></a> to implement the <code class="computeroutput"><span class="identifier">algorithm</span></code> interface. But a custom scheduler
788       might need to track additional properties for a fiber. For instance, a priority-based
789       scheduler would need to track a fiber&#8217;s priority.
790     </p>
791 <p>
792       <span class="bold"><strong>Boost.Fiber</strong></span> provides a mechanism by which
793       your custom scheduler can associate custom properties with each fiber.
794     </p>
795 <p>
796       </p>
797 <h5>
798 <a name="class_fiber_properties_bridgehead"></a>
799   <span class="phrase"><a name="class_fiber_properties"></a></span>
800   <a class="link" href="scheduling.html#class_fiber_properties">Class
801       <code class="computeroutput">fiber_properties</code></a>
802 </h5>
803 <p>
804     </p>
805 <p>
806       A custom fiber properties class must be derived from <code class="computeroutput"><span class="identifier">fiber_properties</span></code>.
807     </p>
808 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">properties</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
809
810 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
811 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
812
813 <span class="keyword">class</span> <span class="identifier">fiber_properties</span> <span class="special">{</span>
814 <span class="keyword">public</span><span class="special">:</span>
815     <span class="identifier">fiber_properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
816
817     <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">fiber_properties</span><span class="special">();</span>
818
819 <span class="keyword">protected</span><span class="special">:</span>
820     <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
821 <span class="special">};</span>
822
823 <span class="special">}}</span>
824 </pre>
825 <h4>
826 <a name="fiber.scheduling.h1"></a>
827       <span class="phrase"><a name="fiber.scheduling.constructor"></a></span><a class="link" href="scheduling.html#fiber.scheduling.constructor">Constructor</a>
828     </h4>
829 <pre class="programlisting"><span class="identifier">fiber_properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
830 </pre>
831 <div class="variablelist">
832 <p class="title"><b></b></p>
833 <dl class="variablelist">
834 <dt><span class="term">Effects:</span></dt>
835 <dd><p>
836             Constructs base-class component of custom subclass.
837           </p></dd>
838 <dt><span class="term">Throws:</span></dt>
839 <dd><p>
840             Nothing.
841           </p></dd>
842 <dt><span class="term">Note:</span></dt>
843 <dd><p>
844             Your subclass constructor must accept a <code class="computeroutput"><span class="identifier">context</span><span class="special">*</span></code> and pass it to the base-class <code class="computeroutput"><span class="identifier">fiber_properties</span></code> constructor.
845           </p></dd>
846 </dl>
847 </div>
848 <p>
849       </p>
850 <h5>
851 <a name="fiber_properties_notify_bridgehead"></a>
852   <span class="phrase"><a name="fiber_properties_notify"></a></span>
853   <a class="link" href="scheduling.html#fiber_properties_notify">Member
854       function <code class="computeroutput">notify</code>()</a>
855 </h5>
856 <p>
857     </p>
858 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
859 </pre>
860 <div class="variablelist">
861 <p class="title"><b></b></p>
862 <dl class="variablelist">
863 <dt><span class="term">Effects:</span></dt>
864 <dd><p>
865             Pass control to the custom <a class="link" href="scheduling.html#class_algorithm_with_properties"><code class="computeroutput">algorithm_with_properties&lt;&gt;</code></a> subclass&#8217;s
866             <a class="link" href="scheduling.html#algorithm_with_properties_property_change"><code class="computeroutput">algorithm_with_properties::property_change()</code></a> method.
867           </p></dd>
868 <dt><span class="term">Throws:</span></dt>
869 <dd><p>
870             Nothing.
871           </p></dd>
872 <dt><span class="term">Note:</span></dt>
873 <dd><p>
874             A custom scheduler&#8217;s <a class="link" href="scheduling.html#algorithm_with_properties_pick_next"><code class="computeroutput">algorithm_with_properties::pick_next()</code></a> method
875             might dynamically select from the ready fibers, or <a class="link" href="scheduling.html#algorithm_with_properties_awakened"><code class="computeroutput">algorithm_with_properties::awakened()</code></a> might
876             instead insert each ready fiber into some form of ready queue for <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>.
877             In the latter case, if application code modifies a fiber property (e.g.
878             priority) that should affect that fiber&#8217;s relationship to other ready
879             fibers, the custom scheduler must be given the opportunity to reorder
880             its ready queue. The custom property subclass should implement an access
881             method to modify such a property; that access method should call <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
882             once the new property value has been stored. This passes control to the
883             custom scheduler&#8217;s <code class="computeroutput"><span class="identifier">property_change</span><span class="special">()</span></code> method, allowing the custom scheduler
884             to reorder its ready queue appropriately. Use at your discretion. Of
885             course, if you define a property which does not affect the behavior of
886             the <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>
887             method, you need not call <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> when that property is modified.
888           </p></dd>
889 </dl>
890 </div>
891 <p>
892       </p>
893 <h5>
894 <a name="class_algorithm_with_properties_bridgehead"></a>
895   <span class="phrase"><a name="class_algorithm_with_properties"></a></span>
896   <a class="link" href="scheduling.html#class_algorithm_with_properties">Template
897       <code class="computeroutput">algorithm_with_properties&lt;&gt;</code></a>
898 </h5>
899 <p>
900     </p>
901 <p>
902       A custom scheduler that depends on a custom properties class <code class="computeroutput"><span class="identifier">PROPS</span></code> should be derived from <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special">&lt;</span><span class="identifier">PROPS</span><span class="special">&gt;</span></code>.
903       <code class="computeroutput"><span class="identifier">PROPS</span></code> should be derived from
904       <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a>.
905     </p>
906 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
907
908 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
909 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
910 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
911
912 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">PROPS</span> <span class="special">&gt;</span>
913 <span class="keyword">struct</span> <span class="identifier">algorithm_with_properties</span> <span class="special">{</span>
914     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*,</span> <span class="identifier">PROPS</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
915
916     <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
917
918     <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
919
920     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
921
922     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
923
924     <span class="identifier">PROPS</span> <span class="special">&amp;</span> <span class="identifier">properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
925
926     <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">property_change</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*,</span> <span class="identifier">PROPS</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
927
928     <span class="keyword">virtual</span> <span class="identifier">fiber_properties</span> <span class="special">*</span> <span class="identifier">new_properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*);</span>
929 <span class="special">};</span>
930
931 <span class="special">}}}</span>
932 </pre>
933 <p>
934       </p>
935 <h5>
936 <a name="algorithm_with_properties_awakened_bridgehead"></a>
937   <span class="phrase"><a name="algorithm_with_properties_awakened"></a></span>
938   <a class="link" href="scheduling.html#algorithm_with_properties_awakened">Member
939       function <code class="computeroutput">awakened</code>()</a>
940 </h5>
941 <p>
942     </p>
943 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">PROPS</span> <span class="special">&amp;</span> <span class="identifier">properties</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
944 </pre>
945 <div class="variablelist">
946 <p class="title"><b></b></p>
947 <dl class="variablelist">
948 <dt><span class="term">Effects:</span></dt>
949 <dd><p>
950             Informs the scheduler that fiber <code class="computeroutput"><span class="identifier">f</span></code>
951             is ready to run, like <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a>. Passes
952             the fiber&#8217;s associated <code class="computeroutput"><span class="identifier">PROPS</span></code>
953             instance.
954           </p></dd>
955 <dt><span class="term">Throws:</span></dt>
956 <dd><p>
957             Nothing.
958           </p></dd>
959 <dt><span class="term">Note:</span></dt>
960 <dd><p>
961             An <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special">&lt;&gt;</span></code> subclass must override this method
962             instead of <code class="computeroutput"><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">awakened</span><span class="special">()</span></code>.
963           </p></dd>
964 </dl>
965 </div>
966 <p>
967       </p>
968 <h5>
969 <a name="algorithm_with_properties_pick_next_bridgehead"></a>
970   <span class="phrase"><a name="algorithm_with_properties_pick_next"></a></span>
971   <a class="link" href="scheduling.html#algorithm_with_properties_pick_next">Member
972       function <code class="computeroutput">pick_next</code>()</a>
973 </h5>
974 <p>
975     </p>
976 <pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
977 </pre>
978 <div class="variablelist">
979 <p class="title"><b></b></p>
980 <dl class="variablelist">
981 <dt><span class="term">Returns:</span></dt>
982 <dd><p>
983             the fiber which is to be resumed next, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
984             if there is no ready fiber.
985           </p></dd>
986 <dt><span class="term">Throws:</span></dt>
987 <dd><p>
988             Nothing.
989           </p></dd>
990 <dt><span class="term">Note:</span></dt>
991 <dd><p>
992             same as <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a>
993           </p></dd>
994 </dl>
995 </div>
996 <p>
997       </p>
998 <h5>
999 <a name="algorithm_with_properties_has_ready_fibers_bridgehead"></a>
1000   <span class="phrase"><a name="algorithm_with_properties_has_ready_fibers"></a></span>
1001   <a class="link" href="scheduling.html#algorithm_with_properties_has_ready_fibers">Member
1002       function <code class="computeroutput">has_ready_fibers</code>()</a>
1003 </h5>
1004 <p>
1005     </p>
1006 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1007 </pre>
1008 <div class="variablelist">
1009 <p class="title"><b></b></p>
1010 <dl class="variablelist">
1011 <dt><span class="term">Returns:</span></dt>
1012 <dd><p>
1013             <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
1014             ready to run.
1015           </p></dd>
1016 <dt><span class="term">Throws:</span></dt>
1017 <dd><p>
1018             Nothing.
1019           </p></dd>
1020 <dt><span class="term">Note:</span></dt>
1021 <dd><p>
1022             same as <a class="link" href="scheduling.html#algorithm_has_ready_fibers"><code class="computeroutput">algorithm::has_ready_fibers()</code></a>
1023           </p></dd>
1024 </dl>
1025 </div>
1026 <p>
1027       </p>
1028 <h5>
1029 <a name="algorithm_with_properties_suspend_until_bridgehead"></a>
1030   <span class="phrase"><a name="algorithm_with_properties_suspend_until"></a></span>
1031   <a class="link" href="scheduling.html#algorithm_with_properties_suspend_until">Member
1032       function <code class="computeroutput">suspend_until</code>()</a>
1033 </h5>
1034 <p>
1035     </p>
1036 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
1037 </pre>
1038 <div class="variablelist">
1039 <p class="title"><b></b></p>
1040 <dl class="variablelist">
1041 <dt><span class="term">Effects:</span></dt>
1042 <dd><p>
1043             Informs the scheduler that no fiber will be ready until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
1044           </p></dd>
1045 <dt><span class="term">Note:</span></dt>
1046 <dd><p>
1047             same as <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>
1048           </p></dd>
1049 </dl>
1050 </div>
1051 <p>
1052       </p>
1053 <h5>
1054 <a name="algorithm_with_properties_notify_bridgehead"></a>
1055   <span class="phrase"><a name="algorithm_with_properties_notify"></a></span>
1056   <a class="link" href="scheduling.html#algorithm_with_properties_notify">Member
1057       function <code class="computeroutput">notify</code>()</a>
1058 </h5>
1059 <p>
1060     </p>
1061 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
1062 </pre>
1063 <div class="variablelist">
1064 <p class="title"><b></b></p>
1065 <dl class="variablelist">
1066 <dt><span class="term">Effects:</span></dt>
1067 <dd><p>
1068             Requests the scheduler to return from a pending call to <a class="link" href="scheduling.html#algorithm_with_properties_suspend_until"><code class="computeroutput">algorithm_with_properties::suspend_until()</code></a>.
1069           </p></dd>
1070 <dt><span class="term">Note:</span></dt>
1071 <dd><p>
1072             same as <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a>
1073           </p></dd>
1074 </dl>
1075 </div>
1076 <p>
1077       </p>
1078 <h5>
1079 <a name="algorithm_with_properties_properties_bridgehead"></a>
1080   <span class="phrase"><a name="algorithm_with_properties_properties"></a></span>
1081   <a class="link" href="scheduling.html#algorithm_with_properties_properties">Member
1082       function <code class="computeroutput">properties</code>()</a>
1083 </h5>
1084 <p>
1085     </p>
1086 <pre class="programlisting"><span class="identifier">PROPS</span><span class="special">&amp;</span> <span class="identifier">properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1087 </pre>
1088 <div class="variablelist">
1089 <p class="title"><b></b></p>
1090 <dl class="variablelist">
1091 <dt><span class="term">Returns:</span></dt>
1092 <dd><p>
1093             the <code class="computeroutput"><span class="identifier">PROPS</span></code> instance associated
1094             with fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1095           </p></dd>
1096 <dt><span class="term">Throws:</span></dt>
1097 <dd><p>
1098             Nothing.
1099           </p></dd>
1100 <dt><span class="term">Note:</span></dt>
1101 <dd><p>
1102             The fiber&#8217;s associated <code class="computeroutput"><span class="identifier">PROPS</span></code>
1103             instance is already passed to <a class="link" href="scheduling.html#algorithm_with_properties_awakened"><code class="computeroutput">algorithm_with_properties::awakened()</code></a> and
1104             <a class="link" href="scheduling.html#algorithm_with_properties_property_change"><code class="computeroutput">algorithm_with_properties::property_change()</code></a>.
1105             However, every <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> subclass is expected to track
1106             a collection of ready <a class="link" href="scheduling.html#class_context"><code class="computeroutput">context</code></a> instances. This method allows
1107             your custom scheduler to retrieve the <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a> subclass
1108             instance for any <code class="computeroutput"><span class="identifier">context</span></code>
1109             in its collection.
1110           </p></dd>
1111 </dl>
1112 </div>
1113 <p>
1114       </p>
1115 <h5>
1116 <a name="algorithm_with_properties_property_change_bridgehead"></a>
1117   <span class="phrase"><a name="algorithm_with_properties_property_change"></a></span>
1118   <a class="link" href="scheduling.html#algorithm_with_properties_property_change">Member
1119       function <code class="computeroutput">property_change</code>()</a>
1120 </h5>
1121 <p>
1122     </p>
1123 <pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">property_change</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">PROPS</span> <span class="special">&amp;</span> <span class="identifier">properties</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1124 </pre>
1125 <div class="variablelist">
1126 <p class="title"><b></b></p>
1127 <dl class="variablelist">
1128 <dt><span class="term">Effects:</span></dt>
1129 <dd><p>
1130             Notify the custom scheduler of a possibly-relevant change to a property
1131             belonging to fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1132             <code class="computeroutput"><span class="identifier">properties</span></code> contains the
1133             new values of all relevant properties.
1134           </p></dd>
1135 <dt><span class="term">Throws:</span></dt>
1136 <dd><p>
1137             Nothing.
1138           </p></dd>
1139 <dt><span class="term">Note:</span></dt>
1140 <dd><p>
1141             This method is only called when a custom <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a> subclass
1142             explicitly calls <a class="link" href="scheduling.html#fiber_properties_notify"><code class="computeroutput">fiber_properties::notify()</code></a>.
1143           </p></dd>
1144 </dl>
1145 </div>
1146 <p>
1147       </p>
1148 <h5>
1149 <a name="algorithm_with_properties_new_properties_bridgehead"></a>
1150   <span class="phrase"><a name="algorithm_with_properties_new_properties"></a></span>
1151   <a class="link" href="scheduling.html#algorithm_with_properties_new_properties">Member
1152       function <code class="computeroutput">new_properties</code>()</a>
1153 </h5>
1154 <p>
1155     </p>
1156 <pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">fiber_properties</span> <span class="special">*</span> <span class="identifier">new_properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">);</span>
1157 </pre>
1158 <div class="variablelist">
1159 <p class="title"><b></b></p>
1160 <dl class="variablelist">
1161 <dt><span class="term">Returns:</span></dt>
1162 <dd><p>
1163             A new instance of <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a> subclass <code class="computeroutput"><span class="identifier">PROPS</span></code>.
1164           </p></dd>
1165 <dt><span class="term">Note:</span></dt>
1166 <dd><p>
1167             By default, <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special">&lt;&gt;::</span><span class="identifier">new_properties</span><span class="special">()</span></code> simply returns <code class="computeroutput"><span class="keyword">new</span>
1168             <span class="identifier">PROPS</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>,
1169             placing the <code class="computeroutput"><span class="identifier">PROPS</span></code> instance
1170             on the heap. Override this method to allocate <code class="computeroutput"><span class="identifier">PROPS</span></code>
1171             some other way. The returned <code class="computeroutput"><span class="identifier">fiber_properties</span></code>
1172             pointer must point to the <code class="computeroutput"><span class="identifier">PROPS</span></code>
1173             instance to be associated with fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1174           </p></dd>
1175 </dl>
1176 </div>
1177 <p>
1178       <a name="context"></a></p>
1179 <h5>
1180 <a name="class_context_bridgehead"></a>
1181   <span class="phrase"><a name="class_context"></a></span>
1182   <a class="link" href="scheduling.html#class_context">Class
1183       <code class="computeroutput">context</code></a>
1184 </h5>
1185 <p>
1186     </p>
1187 <p>
1188       While you are free to treat <code class="computeroutput"><span class="identifier">context</span><span class="special">*</span></code> as an opaque token, certain <code class="computeroutput"><span class="identifier">context</span></code> members may be useful to a custom
1189       scheduler implementation.
1190     </p>
1191 <p>
1192       <a name="ready_queue_t"></a>Of particular note is the fact that <code class="computeroutput"><span class="identifier">context</span></code> contains a hook to participate in
1193       a <a href="http://www.boost.org/doc/libs/release/doc/html/intrusive/list.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">intrusive</span><span class="special">::</span><span class="identifier">list</span></code></a>
1194       <code class="literal">typedef</code>&#8217;ed as <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">scheduler</span><span class="special">::</span><span class="identifier">ready_queue_t</span></code>.
1195       This hook is reserved for use by <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementations. (For
1196       instance, <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a> contains a <code class="computeroutput"><span class="identifier">ready_queue_t</span></code>
1197       instance to manage its ready fibers.) See <a class="link" href="scheduling.html#context_ready_is_linked"><code class="computeroutput">context::ready_is_linked()</code></a>,
1198       <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a>, <a class="link" href="scheduling.html#context_ready_unlink"><code class="computeroutput">context::ready_unlink()</code></a>.
1199     </p>
1200 <p>
1201       Your <code class="computeroutput"><span class="identifier">algorithm</span></code> implementation
1202       may use any container you desire to manage passed <code class="computeroutput"><span class="identifier">context</span></code>
1203       instances. <code class="computeroutput"><span class="identifier">ready_queue_t</span></code> avoids
1204       some of the overhead of typical STL containers.
1205     </p>
1206 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">context</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1207
1208 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
1209 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
1210
1211 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">type</span> <span class="special">{</span>
1212   <span class="identifier">none</span>               <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span>
1213   <span class="identifier">main_context</span>       <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span> <span class="comment">// fiber associated with thread's stack</span>
1214   <span class="identifier">dispatcher_context</span> <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span> <span class="comment">// special fiber for maintenance operations</span>
1215   <span class="identifier">worker_context</span>     <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span> <span class="comment">// fiber not special to the library</span>
1216   <span class="identifier">pinned_context</span>     <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span>  <span class="comment">// fiber must not be migrated to another thread</span>
1217 <span class="special">};</span>
1218
1219 <span class="keyword">class</span> <span class="identifier">context</span> <span class="special">{</span>
1220 <span class="keyword">public</span><span class="special">:</span>
1221     <span class="keyword">class</span> <span class="identifier">id</span><span class="special">;</span>
1222
1223     <span class="keyword">static</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">active</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1224
1225     <span class="identifier">context</span><span class="special">(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
1226     <span class="identifier">context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
1227
1228     <span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1229
1230     <span class="keyword">void</span> <span class="identifier">detach</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1231     <span class="keyword">void</span> <span class="identifier">attach</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1232
1233     <span class="keyword">bool</span> <span class="identifier">is_context</span><span class="special">(</span> <span class="identifier">type</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1234
1235     <span class="keyword">bool</span> <span class="identifier">is_terminated</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1236
1237     <span class="keyword">bool</span> <span class="identifier">ready_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1238     <span class="keyword">bool</span> <span class="identifier">remote_ready_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1239     <span class="keyword">bool</span> <span class="identifier">wait_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1240
1241     <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1242     <span class="keyword">void</span> <span class="identifier">ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1243     <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1244     <span class="keyword">void</span> <span class="identifier">remote_ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1245     <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1246     <span class="keyword">void</span> <span class="identifier">wait_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1247
1248     <span class="keyword">void</span> <span class="identifier">ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1249     <span class="keyword">void</span> <span class="identifier">remote_ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1250     <span class="keyword">void</span> <span class="identifier">wait_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1251
1252     <span class="keyword">void</span> <span class="identifier">suspend</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1253     <span class="keyword">void</span> <span class="identifier">set_ready</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1254 <span class="special">};</span>
1255
1256 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1257
1258 <span class="special">}}</span>
1259 </pre>
1260 <p>
1261       </p>
1262 <h5>
1263 <a name="context_active_bridgehead"></a>
1264   <span class="phrase"><a name="context_active"></a></span>
1265   <a class="link" href="scheduling.html#context_active">Static member function
1266       <code class="computeroutput">active</code>()</a>
1267 </h5>
1268 <p>
1269     </p>
1270 <pre class="programlisting"><span class="keyword">static</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">active</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1271 </pre>
1272 <div class="variablelist">
1273 <p class="title"><b></b></p>
1274 <dl class="variablelist">
1275 <dt><span class="term">Returns:</span></dt>
1276 <dd><p>
1277             Pointer to instance of current fiber.
1278           </p></dd>
1279 <dt><span class="term">Throws:</span></dt>
1280 <dd><p>
1281             Nothing
1282           </p></dd>
1283 </dl>
1284 </div>
1285 <p>
1286       </p>
1287 <h5>
1288 <a name="context_get_id_bridgehead"></a>
1289   <span class="phrase"><a name="context_get_id"></a></span>
1290   <a class="link" href="scheduling.html#context_get_id">Member function <code class="computeroutput">get_id</code>()</a>
1291 </h5>
1292 <p>
1293     </p>
1294 <pre class="programlisting"><span class="identifier">context</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1295 </pre>
1296 <div class="variablelist">
1297 <p class="title"><b></b></p>
1298 <dl class="variablelist">
1299 <dt><span class="term">Returns:</span></dt>
1300 <dd><p>
1301             If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1302             refers to a fiber of execution, an instance of <a class="link" href="fiber_mgmt.html#class_fiber_id"><code class="computeroutput"><span class="identifier">fiber</span><span class="special">::</span><span class="identifier">id</span></code></a> that represents that fiber. Otherwise
1303             returns a default-constructed <a class="link" href="fiber_mgmt.html#class_fiber_id"><code class="computeroutput"><span class="identifier">fiber</span><span class="special">::</span><span class="identifier">id</span></code></a>.
1304           </p></dd>
1305 <dt><span class="term">Throws:</span></dt>
1306 <dd><p>
1307             Nothing
1308           </p></dd>
1309 <dt><span class="term">See also:</span></dt>
1310 <dd><p>
1311             <a class="link" href="fiber_mgmt/fiber.html#fiber_get_id"><code class="computeroutput">fiber::get_id()</code></a>
1312           </p></dd>
1313 </dl>
1314 </div>
1315 <p>
1316       </p>
1317 <h5>
1318 <a name="context_attach_bridgehead"></a>
1319   <span class="phrase"><a name="context_attach"></a></span>
1320   <a class="link" href="scheduling.html#context_attach">Member function <code class="computeroutput">attach</code>()</a>
1321 </h5>
1322 <p>
1323     </p>
1324 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">attach</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1325 </pre>
1326 <div class="variablelist">
1327 <p class="title"><b></b></p>
1328 <dl class="variablelist">
1329 <dt><span class="term">Precondition:</span></dt>
1330 <dd><p>
1331             <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1332             <span class="special">==</span> <span class="keyword">nullptr</span></code>
1333           </p></dd>
1334 <dt><span class="term">Effects:</span></dt>
1335 <dd><p>
1336             Attach fiber <code class="computeroutput"><span class="identifier">f</span></code> to scheduler
1337             running <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1338           </p></dd>
1339 <dt><span class="term">Postcondition:</span></dt>
1340 <dd><p>
1341             <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1342             <span class="special">!=</span> <span class="keyword">nullptr</span></code>
1343           </p></dd>
1344 <dt><span class="term">Throws:</span></dt>
1345 <dd><p>
1346             Nothing
1347           </p></dd>
1348 <dt><span class="term">Note:</span></dt>
1349 <dd><p>
1350             A typical call: <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">active</span><span class="special">()-&gt;</span><span class="identifier">attach</span><span class="special">(</span><span class="identifier">f</span><span class="special">);</span></code>
1351           </p></dd>
1352 <dt><span class="term">Note:</span></dt>
1353 <dd><p>
1354             <code class="computeroutput"><span class="identifier">f</span></code> must not be the running
1355             fiber&#8217;s context. It must not be <a class="link" href="overview.html#blocking"><span class="emphasis"><em>blocked</em></span></a>
1356             or terminated. It must not be a <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1357             It must be currently detached. It must not currently be linked into an
1358             <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation&#8217;s ready queue. Most of these conditions
1359             are implied by <code class="computeroutput"><span class="identifier">f</span></code> being
1360             owned by an <code class="computeroutput"><span class="identifier">algorithm</span></code>
1361             implementation: that is, it has been passed to <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a> but
1362             has not yet been returned by <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a>.
1363             Typically a <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code> implementation would call <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code>
1364             with the <code class="computeroutput"><span class="identifier">context</span><span class="special">*</span></code>
1365             it is about to return. It must first remove <code class="computeroutput"><span class="identifier">f</span></code>
1366             from its ready queue. You should never pass a <code class="computeroutput"><span class="identifier">pinned_context</span></code>
1367             to <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code>
1368             because you should never have called its <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> method in the first place.
1369           </p></dd>
1370 </dl>
1371 </div>
1372 <p>
1373       </p>
1374 <h5>
1375 <a name="context_detach_bridgehead"></a>
1376   <span class="phrase"><a name="context_detach"></a></span>
1377   <a class="link" href="scheduling.html#context_detach">Member function <code class="computeroutput">detach</code>()</a>
1378 </h5>
1379 <p>
1380     </p>
1381 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">detach</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1382 </pre>
1383 <div class="variablelist">
1384 <p class="title"><b></b></p>
1385 <dl class="variablelist">
1386 <dt><span class="term">Precondition:</span></dt>
1387 <dd><p>
1388             <code class="computeroutput"><span class="special">(</span><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span> <span class="special">!=</span> <span class="keyword">nullptr</span><span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="special">!</span>
1389             <span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_context</span><span class="special">(</span><span class="identifier">pinned_context</span><span class="special">)</span></code>
1390           </p></dd>
1391 <dt><span class="term">Effects:</span></dt>
1392 <dd><p>
1393             Detach fiber <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1394             from its scheduler running <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1395           </p></dd>
1396 <dt><span class="term">Throws:</span></dt>
1397 <dd><p>
1398             Nothing
1399           </p></dd>
1400 <dt><span class="term">Postcondition:</span></dt>
1401 <dd><p>
1402             <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1403             <span class="special">==</span> <span class="keyword">nullptr</span></code>
1404           </p></dd>
1405 <dt><span class="term">Note:</span></dt>
1406 <dd><p>
1407             This method must be called on the thread with which the fiber is currently
1408             associated. <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1409             must not be the running fiber&#8217;s context. It must not be <a class="link" href="overview.html#blocking"><span class="emphasis"><em>blocked</em></span></a>
1410             or terminated. It must not be a <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1411             It must not be detached already. It must not already be linked into an
1412             <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation&#8217;s ready queue. Most of these conditions
1413             are implied by <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1414             being passed to <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a>; an <code class="computeroutput"><span class="identifier">awakened</span><span class="special">()</span></code>
1415             implementation must, however, test for <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1416             It must call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code>
1417             <span class="emphasis"><em>before</em></span> linking <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> into its ready queue.
1418           </p></dd>
1419 <dt><span class="term">Note:</span></dt>
1420 <dd><p>
1421             In particular, it is erroneous to attempt to migrate a fiber from one
1422             thread to another by calling both <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code> in the <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a> method.
1423             <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>
1424             is called on the intended destination thread. <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> must be called on the fiber&#8217;s original
1425             thread. You must call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> in the corresponding <code class="computeroutput"><span class="identifier">awakened</span><span class="special">()</span></code>
1426             method.
1427           </p></dd>
1428 <dt><span class="term">Note:</span></dt>
1429 <dd><p>
1430             Unless you intend make a fiber available for potential migration to a
1431             different thread, you should call neither <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> nor <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code> with its <code class="computeroutput"><span class="identifier">context</span></code>.
1432           </p></dd>
1433 </dl>
1434 </div>
1435 <p>
1436       </p>
1437 <h5>
1438 <a name="context_is_context_bridgehead"></a>
1439   <span class="phrase"><a name="context_is_context"></a></span>
1440   <a class="link" href="scheduling.html#context_is_context">Member function
1441       <code class="computeroutput">is_context</code>()</a>
1442 </h5>
1443 <p>
1444     </p>
1445 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_context</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1446 </pre>
1447 <div class="variablelist">
1448 <p class="title"><b></b></p>
1449 <dl class="variablelist">
1450 <dt><span class="term">Returns:</span></dt>
1451 <dd><p>
1452             <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is of the specified type.
1453           </p></dd>
1454 <dt><span class="term">Throws:</span></dt>
1455 <dd><p>
1456             Nothing
1457           </p></dd>
1458 <dt><span class="term">Note:</span></dt>
1459 <dd><p>
1460             <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="identifier">worker_context</span></code> here means any fiber
1461             not special to the library. For <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="identifier">main_context</span></code>
1462             the <code class="computeroutput"><span class="identifier">context</span></code> is associated
1463             with the <span class="quote">&#8220;<span class="quote">main</span>&#8221;</span> fiber of the thread: the one implicitly
1464             created by the thread itself, rather than one explicitly created by
1465             <span class="bold"><strong>Boost.Fiber</strong></span>. For <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="identifier">dispatcher_context</span></code>
1466             the <code class="computeroutput"><span class="identifier">context</span></code> is associated
1467             with a <span class="quote">&#8220;<span class="quote">dispatching</span>&#8221;</span> fiber, responsible for dispatching
1468             awakened fibers to a scheduler&#8217;s ready-queue. The <span class="quote">&#8220;<span class="quote">dispatching</span>&#8221;</span>
1469             fiber is an implementation detail of the fiber manager. The context of
1470             the <span class="quote">&#8220;<span class="quote">main</span>&#8221;</span> or <span class="quote">&#8220;<span class="quote">dispatching</span>&#8221;</span> fiber &#8212; any fiber
1471             for which <code class="computeroutput"><span class="identifier">is_context</span><span class="special">(</span><span class="identifier">pinned_context</span><span class="special">)</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>
1472             &#8212; must never be passed to <a class="link" href="scheduling.html#context_detach"><code class="computeroutput">context::detach()</code></a>.
1473           </p></dd>
1474 </dl>
1475 </div>
1476 <p>
1477       </p>
1478 <h5>
1479 <a name="context_is_terminated_bridgehead"></a>
1480   <span class="phrase"><a name="context_is_terminated"></a></span>
1481   <a class="link" href="scheduling.html#context_is_terminated">Member
1482       function <code class="computeroutput">is_terminated</code>()</a>
1483 </h5>
1484 <p>
1485     </p>
1486 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_terminated</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1487 </pre>
1488 <div class="variablelist">
1489 <p class="title"><b></b></p>
1490 <dl class="variablelist">
1491 <dt><span class="term">Returns:</span></dt>
1492 <dd><p>
1493             <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is no longer a valid context.
1494           </p></dd>
1495 <dt><span class="term">Throws:</span></dt>
1496 <dd><p>
1497             Nothing
1498           </p></dd>
1499 <dt><span class="term">Note:</span></dt>
1500 <dd><p>
1501             The <code class="computeroutput"><span class="identifier">context</span></code> has returned
1502             from its fiber-function and is no longer considered a valid context.
1503           </p></dd>
1504 </dl>
1505 </div>
1506 <p>
1507       </p>
1508 <h5>
1509 <a name="context_ready_is_linked_bridgehead"></a>
1510   <span class="phrase"><a name="context_ready_is_linked"></a></span>
1511   <a class="link" href="scheduling.html#context_ready_is_linked">Member
1512       function <code class="computeroutput">ready_is_linked</code>()</a>
1513 </h5>
1514 <p>
1515     </p>
1516 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">ready_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1517 </pre>
1518 <div class="variablelist">
1519 <p class="title"><b></b></p>
1520 <dl class="variablelist">
1521 <dt><span class="term">Returns:</span></dt>
1522 <dd><p>
1523             <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is stored in an <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>
1524 implementation&#8217;s
1525             ready-queue.
1526           </p></dd>
1527 <dt><span class="term">Throws:</span></dt>
1528 <dd><p>
1529             Nothing
1530           </p></dd>
1531 <dt><span class="term">Note:</span></dt>
1532 <dd><p>
1533             Specifically, this method indicates whether <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a> has
1534             been called on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1535             <code class="computeroutput"><span class="identifier">ready_is_linked</span><span class="special">()</span></code>
1536             has no information about participation in any other containers.
1537           </p></dd>
1538 </dl>
1539 </div>
1540 <p>
1541       </p>
1542 <h5>
1543 <a name="context_remote_ready_is_linked_bridgehead"></a>
1544   <span class="phrase"><a name="context_remote_ready_is_linked"></a></span>
1545   <a class="link" href="scheduling.html#context_remote_ready_is_linked">Member
1546       function <code class="computeroutput">remote_ready_is_linked</code>()</a>
1547 </h5>
1548 <p>
1549     </p>
1550 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">remote_ready_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1551 </pre>
1552 <div class="variablelist">
1553 <p class="title"><b></b></p>
1554 <dl class="variablelist">
1555 <dt><span class="term">Returns:</span></dt>
1556 <dd><p>
1557             <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is stored in the fiber manager&#8217;s remote-ready-queue.
1558           </p></dd>
1559 <dt><span class="term">Throws:</span></dt>
1560 <dd><p>
1561             Nothing
1562           </p></dd>
1563 <dt><span class="term">Note:</span></dt>
1564 <dd><p>
1565             A <code class="computeroutput"><span class="identifier">context</span></code> signaled as
1566             ready by another thread is first stored in the fiber manager&#8217;s remote-ready-queue.
1567             This is the mechanism by which the fiber manager protects an <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation
1568             from cross-thread <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a> calls.
1569           </p></dd>
1570 </dl>
1571 </div>
1572 <p>
1573       </p>
1574 <h5>
1575 <a name="context_wait_is_linked_bridgehead"></a>
1576   <span class="phrase"><a name="context_wait_is_linked"></a></span>
1577   <a class="link" href="scheduling.html#context_wait_is_linked">Member
1578       function <code class="computeroutput">wait_is_linked</code>()</a>
1579 </h5>
1580 <p>
1581     </p>
1582 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">wait_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1583 </pre>
1584 <div class="variablelist">
1585 <p class="title"><b></b></p>
1586 <dl class="variablelist">
1587 <dt><span class="term">Returns:</span></dt>
1588 <dd><p>
1589             <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is stored in the wait-queue of some
1590             synchronization object.
1591           </p></dd>
1592 <dt><span class="term">Throws:</span></dt>
1593 <dd><p>
1594             Nothing
1595           </p></dd>
1596 <dt><span class="term">Note:</span></dt>
1597 <dd><p>
1598             The <code class="computeroutput"><span class="identifier">context</span></code> of a fiber
1599             waiting on a synchronization object (e.g. <code class="computeroutput"><span class="identifier">mutex</span></code>,
1600             <code class="computeroutput"><span class="identifier">condition_variable</span></code> etc.)
1601             is stored in the wait-queue of that synchronization object.
1602           </p></dd>
1603 </dl>
1604 </div>
1605 <p>
1606       </p>
1607 <h5>
1608 <a name="context_ready_link_bridgehead"></a>
1609   <span class="phrase"><a name="context_ready_link"></a></span>
1610   <a class="link" href="scheduling.html#context_ready_link">Member function
1611       <code class="computeroutput">ready_link</code>()</a>
1612 </h5>
1613 <p>
1614     </p>
1615 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1616 <span class="keyword">void</span> <span class="identifier">ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1617 </pre>
1618 <div class="variablelist">
1619 <p class="title"><b></b></p>
1620 <dl class="variablelist">
1621 <dt><span class="term">Effects:</span></dt>
1622 <dd><p>
1623             Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1624             in ready-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1625           </p></dd>
1626 <dt><span class="term">Throws:</span></dt>
1627 <dd><p>
1628             Nothing
1629           </p></dd>
1630 <dt><span class="term">Note:</span></dt>
1631 <dd><p>
1632             Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1633             a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>,
1634             e.g. an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">scheduler</span><span class="special">::</span><span class="identifier">ready_queue_t</span></code>.
1635             Specifically, it must be a <a href="http://www.boost.org/doc/libs/release/doc/html/intrusive/list.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">intrusive</span><span class="special">::</span><span class="identifier">list</span></code></a> compatible with the <code class="computeroutput"><span class="identifier">list_member_hook</span></code> stored in the <code class="computeroutput"><span class="identifier">context</span></code> object.
1636           </p></dd>
1637 </dl>
1638 </div>
1639 <p>
1640       </p>
1641 <h5>
1642 <a name="context_remote_ready_link_bridgehead"></a>
1643   <span class="phrase"><a name="context_remote_ready_link"></a></span>
1644   <a class="link" href="scheduling.html#context_remote_ready_link">Member
1645       function <code class="computeroutput">remote_ready_link</code>()</a>
1646 </h5>
1647 <p>
1648     </p>
1649 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1650 <span class="keyword">void</span> <span class="identifier">remote_ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1651 </pre>
1652 <div class="variablelist">
1653 <p class="title"><b></b></p>
1654 <dl class="variablelist">
1655 <dt><span class="term">Effects:</span></dt>
1656 <dd><p>
1657             Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1658             in remote-ready-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1659           </p></dd>
1660 <dt><span class="term">Throws:</span></dt>
1661 <dd><p>
1662             Nothing
1663           </p></dd>
1664 <dt><span class="term">Note:</span></dt>
1665 <dd><p>
1666             Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1667             a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>.
1668           </p></dd>
1669 </dl>
1670 </div>
1671 <p>
1672       </p>
1673 <h5>
1674 <a name="context_wait_link_bridgehead"></a>
1675   <span class="phrase"><a name="context_wait_link"></a></span>
1676   <a class="link" href="scheduling.html#context_wait_link">Member function
1677       <code class="computeroutput">wait_link</code>()</a>
1678 </h5>
1679 <p>
1680     </p>
1681 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1682 <span class="keyword">void</span> <span class="identifier">wait_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1683 </pre>
1684 <div class="variablelist">
1685 <p class="title"><b></b></p>
1686 <dl class="variablelist">
1687 <dt><span class="term">Effects:</span></dt>
1688 <dd><p>
1689             Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1690             in wait-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1691           </p></dd>
1692 <dt><span class="term">Throws:</span></dt>
1693 <dd><p>
1694             Nothing
1695           </p></dd>
1696 <dt><span class="term">Note:</span></dt>
1697 <dd><p>
1698             Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1699             a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>.
1700           </p></dd>
1701 </dl>
1702 </div>
1703 <p>
1704       </p>
1705 <h5>
1706 <a name="context_ready_unlink_bridgehead"></a>
1707   <span class="phrase"><a name="context_ready_unlink"></a></span>
1708   <a class="link" href="scheduling.html#context_ready_unlink">Member
1709       function <code class="computeroutput">ready_unlink</code>()</a>
1710 </h5>
1711 <p>
1712     </p>
1713 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1714 </pre>
1715 <div class="variablelist">
1716 <p class="title"><b></b></p>
1717 <dl class="variablelist">
1718 <dt><span class="term">Effects:</span></dt>
1719 <dd><p>
1720             Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1721             from ready-queue: undoes the effect of <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a>.
1722           </p></dd>
1723 <dt><span class="term">Throws:</span></dt>
1724 <dd><p>
1725             Nothing
1726           </p></dd>
1727 </dl>
1728 </div>
1729 <p>
1730       </p>
1731 <h5>
1732 <a name="context_remote_ready_unlink_bridgehead"></a>
1733   <span class="phrase"><a name="context_remote_ready_unlink"></a></span>
1734   <a class="link" href="scheduling.html#context_remote_ready_unlink">Member
1735       function <code class="computeroutput">remote_ready_unlink</code>()</a>
1736 </h5>
1737 <p>
1738     </p>
1739 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">remote_ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1740 </pre>
1741 <div class="variablelist">
1742 <p class="title"><b></b></p>
1743 <dl class="variablelist">
1744 <dt><span class="term">Effects:</span></dt>
1745 <dd><p>
1746             Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1747             from remote-ready-queue.
1748           </p></dd>
1749 <dt><span class="term">Throws:</span></dt>
1750 <dd><p>
1751             Nothing
1752           </p></dd>
1753 </dl>
1754 </div>
1755 <p>
1756       </p>
1757 <h5>
1758 <a name="context_wait_unlink_bridgehead"></a>
1759   <span class="phrase"><a name="context_wait_unlink"></a></span>
1760   <a class="link" href="scheduling.html#context_wait_unlink">Member
1761       function <code class="computeroutput">wait_unlink</code>()</a>
1762 </h5>
1763 <p>
1764     </p>
1765 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1766 </pre>
1767 <div class="variablelist">
1768 <p class="title"><b></b></p>
1769 <dl class="variablelist">
1770 <dt><span class="term">Effects:</span></dt>
1771 <dd><p>
1772             Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1773             from wait-queue.
1774           </p></dd>
1775 <dt><span class="term">Throws:</span></dt>
1776 <dd><p>
1777             Nothing
1778           </p></dd>
1779 </dl>
1780 </div>
1781 <p>
1782       </p>
1783 <h5>
1784 <a name="context_suspend_bridgehead"></a>
1785   <span class="phrase"><a name="context_suspend"></a></span>
1786   <a class="link" href="scheduling.html#context_suspend">Member function <code class="computeroutput">suspend</code>()</a>
1787 </h5>
1788 <p>
1789     </p>
1790 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">suspend</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1791 </pre>
1792 <div class="variablelist">
1793 <p class="title"><b></b></p>
1794 <dl class="variablelist">
1795 <dt><span class="term">Effects:</span></dt>
1796 <dd><p>
1797             Suspends the running fiber (the fiber associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>) until some other fiber passes <code class="computeroutput"><span class="keyword">this</span></code> to <a class="link" href="scheduling.html#context_set_ready"><code class="computeroutput">context::set_ready()</code></a>.
1798             <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1799             is marked as not-ready, and control passes to the scheduler to select
1800             another fiber to run.
1801           </p></dd>
1802 <dt><span class="term">Throws:</span></dt>
1803 <dd><p>
1804             Nothing
1805           </p></dd>
1806 <dt><span class="term">Note:</span></dt>
1807 <dd><p>
1808             This is a low-level API potentially useful for integration with other
1809             frameworks. It is not intended to be directly invoked by a typical application
1810             program.
1811           </p></dd>
1812 <dt><span class="term">Note:</span></dt>
1813 <dd><p>
1814             The burden is on the caller to arrange for a call to <code class="computeroutput"><span class="identifier">set_ready</span><span class="special">()</span></code> with a pointer to <code class="computeroutput"><span class="keyword">this</span></code>
1815             at some future time.
1816           </p></dd>
1817 </dl>
1818 </div>
1819 <p>
1820       </p>
1821 <h5>
1822 <a name="context_set_ready_bridgehead"></a>
1823   <span class="phrase"><a name="context_set_ready"></a></span>
1824   <a class="link" href="scheduling.html#context_set_ready">Member function
1825       <code class="computeroutput">set_ready</code>()</a>
1826 </h5>
1827 <p>
1828     </p>
1829 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_ready</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">ctx</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1830 </pre>
1831 <div class="variablelist">
1832 <p class="title"><b></b></p>
1833 <dl class="variablelist">
1834 <dt><span class="term">Effects:</span></dt>
1835 <dd><p>
1836             Mark the fiber associated with context <code class="computeroutput"><span class="special">*</span><span class="identifier">ctx</span></code> as being ready to run. This does
1837             not immediately resume that fiber; rather it passes the fiber to the
1838             scheduler for subsequent resumption. If the scheduler is idle (has not
1839             returned from a call to <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>),
1840             <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a> is called to wake it up.
1841           </p></dd>
1842 <dt><span class="term">Throws:</span></dt>
1843 <dd><p>
1844             Nothing
1845           </p></dd>
1846 <dt><span class="term">Note:</span></dt>
1847 <dd><p>
1848             This is a low-level API potentially useful for integration with other
1849             frameworks. It is not intended to be directly invoked by a typical application
1850             program.
1851           </p></dd>
1852 <dt><span class="term">Note:</span></dt>
1853 <dd><p>
1854             It is explicitly supported to call <code class="computeroutput"><span class="identifier">set_ready</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">)</span></code> from a thread other than the one on
1855             which <code class="computeroutput"><span class="special">*</span><span class="identifier">ctx</span></code>
1856             is currently suspended. The corresponding fiber will be resumed on its
1857             original thread in due course.
1858           </p></dd>
1859 </dl>
1860 </div>
1861 <p>
1862       </p>
1863 <h5>
1864 <a name="context_less_bridgehead"></a>
1865   <span class="phrase"><a name="context_less"></a></span>
1866   <a class="link" href="scheduling.html#context_less">Non-member function <code class="computeroutput">operator&lt;()</code></a>
1867 </h5>
1868 <p>
1869     </p>
1870 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1871 </pre>
1872 <div class="variablelist">
1873 <p class="title"><b></b></p>
1874 <dl class="variablelist">
1875 <dt><span class="term">Returns:</span></dt>
1876 <dd><p>
1877             <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="identifier">l</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">r</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span></code>
1878             is <code class="computeroutput"><span class="keyword">true</span></code>, <code class="computeroutput"><span class="keyword">false</span></code>
1879             otherwise.
1880           </p></dd>
1881 <dt><span class="term">Throws:</span></dt>
1882 <dd><p>
1883             Nothing.
1884           </p></dd>
1885 </dl>
1886 </div>
1887 </div>
1888 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1889 <td align="left"></td>
1890 <td align="right"><div class="copyright-footer">Copyright &#169; 2013 Oliver Kowalke<p>
1891         Distributed under the Boost Software License, Version 1.0. (See accompanying
1892         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>)
1893       </p>
1894 </div></td>
1895 </tr></table>
1896 <hr>
1897 <div class="spirit-nav">
1898 <a accesskey="p" href="fiber_mgmt/this_fiber.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>
1899 </div>
1900 </body>
1901 </html>