]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/fiber/doc/html/fiber/scheduling.html
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / 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.75.2">
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><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><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>
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><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>
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><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>
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><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>
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><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>
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><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><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>
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><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>
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><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>
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><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>
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><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>
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><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 <p>
438 This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>; ready fibers are shared between
439 all instances (running on different threads) of shared_work.
440 </p>
441 <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>
442
443 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
444 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
445 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
446
447 <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>
448 <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>
449
450 <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>
451
452 <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>
453
454 <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>
455
456 <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>
457 <span class="special">};</span>
458
459 <span class="special">}}}</span>
460 </pre>
461 <p>
462 </p>
463 <h5>
464 <a name="shared_work_awakened_bridgehead"></a>
465 <span><a name="shared_work_awakened"></a></span>
466 <a class="link" href="scheduling.html#shared_work_awakened">Member
467 function <code class="computeroutput">awakened</code>()</a>
468 </h5>
469 <p>
470 </p>
471 <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>
472 </pre>
473 <div class="variablelist">
474 <p class="title"><b></b></p>
475 <dl>
476 <dt><span class="term">Effects:</span></dt>
477 <dd><p>
478 Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
479 the shared ready queue.
480 </p></dd>
481 <dt><span class="term">Throws:</span></dt>
482 <dd><p>
483 Nothing.
484 </p></dd>
485 </dl>
486 </div>
487 <p>
488 </p>
489 <h5>
490 <a name="shared_work_pick_next_bridgehead"></a>
491 <span><a name="shared_work_pick_next"></a></span>
492 <a class="link" href="scheduling.html#shared_work_pick_next">Member
493 function <code class="computeroutput">pick_next</code>()</a>
494 </h5>
495 <p>
496 </p>
497 <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>
498 </pre>
499 <div class="variablelist">
500 <p class="title"><b></b></p>
501 <dl>
502 <dt><span class="term">Returns:</span></dt>
503 <dd><p>
504 the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
505 if the queue is empty.
506 </p></dd>
507 <dt><span class="term">Throws:</span></dt>
508 <dd><p>
509 Nothing.
510 </p></dd>
511 <dt><span class="term">Note:</span></dt>
512 <dd><p>
513 Placing ready fibers onto the tail of the shared queue, and returning
514 them from the head of that queue, shares the thread between ready fibers
515 in round-robin fashion.
516 </p></dd>
517 </dl>
518 </div>
519 <p>
520 </p>
521 <h5>
522 <a name="shared_work_has_ready_fibers_bridgehead"></a>
523 <span><a name="shared_work_has_ready_fibers"></a></span>
524 <a class="link" href="scheduling.html#shared_work_has_ready_fibers">Member
525 function <code class="computeroutput">has_ready_fibers</code>()</a>
526 </h5>
527 <p>
528 </p>
529 <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>
530 </pre>
531 <div class="variablelist">
532 <p class="title"><b></b></p>
533 <dl>
534 <dt><span class="term">Returns:</span></dt>
535 <dd><p>
536 <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
537 ready to run.
538 </p></dd>
539 <dt><span class="term">Throws:</span></dt>
540 <dd><p>
541 Nothing.
542 </p></dd>
543 </dl>
544 </div>
545 <p>
546 </p>
547 <h5>
548 <a name="shared_work_suspend_until_bridgehead"></a>
549 <span><a name="shared_work_suspend_until"></a></span>
550 <a class="link" href="scheduling.html#shared_work_suspend_until">Member
551 function <code class="computeroutput">suspend_until</code>()</a>
552 </h5>
553 <p>
554 </p>
555 <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>
556 </pre>
557 <div class="variablelist">
558 <p class="title"><b></b></p>
559 <dl>
560 <dt><span class="term">Effects:</span></dt>
561 <dd><p>
562 Informs <code class="computeroutput"><span class="identifier">shared_work</span></code> that
563 no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
564 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>.
565 </p></dd>
566 <dt><span class="term">Throws:</span></dt>
567 <dd><p>
568 Nothing.
569 </p></dd>
570 </dl>
571 </div>
572 <p>
573 </p>
574 <h5>
575 <a name="shared_work_notify_bridgehead"></a>
576 <span><a name="shared_work_notify"></a></span>
577 <a class="link" href="scheduling.html#shared_work_notify">Member function
578 <code class="computeroutput">notify</code>()</a>
579 </h5>
580 <p>
581 </p>
582 <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>
583 </pre>
584 <div class="variablelist">
585 <p class="title"><b></b></p>
586 <dl>
587 <dt><span class="term">Effects:</span></dt>
588 <dd><p>
589 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>,
590 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>.
591 </p></dd>
592 <dt><span class="term">Throws:</span></dt>
593 <dd><p>
594 Nothing.
595 </p></dd>
596 </dl>
597 </div>
598 <h4>
599 <a name="fiber.scheduling.h0"></a>
600 <span><a name="fiber.scheduling.custom_scheduler_fiber_properties"></a></span><a class="link" href="scheduling.html#fiber.scheduling.custom_scheduler_fiber_properties">Custom
601 Scheduler Fiber Properties</a>
602 </h4>
603 <p>
604 A scheduler class directly derived from <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> can use any
605 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
606 might need to track additional properties for a fiber. For instance, a priority-based
607 scheduler would need to track a fiber&#8217;s priority.
608 </p>
609 <p>
610 <span class="bold"><strong>Boost.Fiber</strong></span> provides a mechanism by which
611 your custom scheduler can associate custom properties with each fiber.
612 </p>
613 <p>
614 </p>
615 <h5>
616 <a name="class_fiber_properties_bridgehead"></a>
617 <span><a name="class_fiber_properties"></a></span>
618 <a class="link" href="scheduling.html#class_fiber_properties">Class
619 <code class="computeroutput">fiber_properties</code></a>
620 </h5>
621 <p>
622 </p>
623 <p>
624 A custom fiber properties class must be derived from <code class="computeroutput"><span class="identifier">fiber_properties</span></code>.
625 </p>
626 <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>
627
628 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
629 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
630
631 <span class="keyword">class</span> <span class="identifier">fiber_properties</span> <span class="special">{</span>
632 <span class="keyword">public</span><span class="special">:</span>
633 <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>
634
635 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">fiber_properties</span><span class="special">();</span>
636
637 <span class="keyword">protected</span><span class="special">:</span>
638 <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 <h4>
644 <a name="fiber.scheduling.h1"></a>
645 <span><a name="fiber.scheduling.constructor"></a></span><a class="link" href="scheduling.html#fiber.scheduling.constructor">Constructor</a>
646 </h4>
647 <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>
648 </pre>
649 <div class="variablelist">
650 <p class="title"><b></b></p>
651 <dl>
652 <dt><span class="term">Effects:</span></dt>
653 <dd><p>
654 Constructs base-class component of custom subclass.
655 </p></dd>
656 <dt><span class="term">Throws:</span></dt>
657 <dd><p>
658 Nothing.
659 </p></dd>
660 <dt><span class="term">Note:</span></dt>
661 <dd><p>
662 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.
663 </p></dd>
664 </dl>
665 </div>
666 <p>
667 </p>
668 <h5>
669 <a name="fiber_properties_notify_bridgehead"></a>
670 <span><a name="fiber_properties_notify"></a></span>
671 <a class="link" href="scheduling.html#fiber_properties_notify">Member
672 function <code class="computeroutput">notify</code>()</a>
673 </h5>
674 <p>
675 </p>
676 <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>
677 </pre>
678 <div class="variablelist">
679 <p class="title"><b></b></p>
680 <dl>
681 <dt><span class="term">Effects:</span></dt>
682 <dd><p>
683 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
684 <a class="link" href="scheduling.html#algorithm_with_properties_property_change"><code class="computeroutput">algorithm_with_properties::property_change()</code></a> method.
685 </p></dd>
686 <dt><span class="term">Throws:</span></dt>
687 <dd><p>
688 Nothing.
689 </p></dd>
690 <dt><span class="term">Note:</span></dt>
691 <dd><p>
692 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
693 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
694 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>.
695 In the latter case, if application code modifies a fiber property (e.g.
696 priority) that should affect that fiber&#8217;s relationship to other ready
697 fibers, the custom scheduler must be given the opportunity to reorder
698 its ready queue. The custom property subclass should implement an access
699 method to modify such a property; that access method should call <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
700 once the new property value has been stored. This passes control to the
701 custom scheduler&#8217;s <code class="computeroutput"><span class="identifier">property_change</span><span class="special">()</span></code> method, allowing the custom scheduler
702 to reorder its ready queue appropriately. Use at your discretion. Of
703 course, if you define a property which does not affect the behavior of
704 the <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>
705 method, you need not call <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> when that property is modified.
706 </p></dd>
707 </dl>
708 </div>
709 <p>
710 </p>
711 <h5>
712 <a name="class_algorithm_with_properties_bridgehead"></a>
713 <span><a name="class_algorithm_with_properties"></a></span>
714 <a class="link" href="scheduling.html#class_algorithm_with_properties">Template
715 <code class="computeroutput">algorithm_with_properties&lt;&gt;</code></a>
716 </h5>
717 <p>
718 </p>
719 <p>
720 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>.
721 <code class="computeroutput"><span class="identifier">PROPS</span></code> should be derived from
722 <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a>.
723 </p>
724 <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>
725
726 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
727 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
728 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
729
730 <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>
731 <span class="keyword">struct</span> <span class="identifier">algorithm_with_properties</span> <span class="special">{</span>
732 <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>
733
734 <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>
735
736 <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>
737
738 <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>
739
740 <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>
741
742 <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>
743
744 <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>
745
746 <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>
747 <span class="special">};</span>
748
749 <span class="special">}}}</span>
750 </pre>
751 <p>
752 </p>
753 <h5>
754 <a name="algorithm_with_properties_awakened_bridgehead"></a>
755 <span><a name="algorithm_with_properties_awakened"></a></span>
756 <a class="link" href="scheduling.html#algorithm_with_properties_awakened">Member
757 function <code class="computeroutput">awakened</code>()</a>
758 </h5>
759 <p>
760 </p>
761 <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>
762 </pre>
763 <div class="variablelist">
764 <p class="title"><b></b></p>
765 <dl>
766 <dt><span class="term">Effects:</span></dt>
767 <dd><p>
768 Informs the scheduler that fiber <code class="computeroutput"><span class="identifier">f</span></code>
769 is ready to run, like <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a>. Passes
770 the fiber&#8217;s associated <code class="computeroutput"><span class="identifier">PROPS</span></code>
771 instance.
772 </p></dd>
773 <dt><span class="term">Throws:</span></dt>
774 <dd><p>
775 Nothing.
776 </p></dd>
777 <dt><span class="term">Note:</span></dt>
778 <dd><p>
779 An <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special">&lt;&gt;</span></code> subclass must override this method
780 instead of <code class="computeroutput"><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">awakened</span><span class="special">()</span></code>.
781 </p></dd>
782 </dl>
783 </div>
784 <p>
785 </p>
786 <h5>
787 <a name="algorithm_with_properties_pick_next_bridgehead"></a>
788 <span><a name="algorithm_with_properties_pick_next"></a></span>
789 <a class="link" href="scheduling.html#algorithm_with_properties_pick_next">Member
790 function <code class="computeroutput">pick_next</code>()</a>
791 </h5>
792 <p>
793 </p>
794 <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>
795 </pre>
796 <div class="variablelist">
797 <p class="title"><b></b></p>
798 <dl>
799 <dt><span class="term">Returns:</span></dt>
800 <dd><p>
801 the fiber which is to be resumed next, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
802 if there is no ready fiber.
803 </p></dd>
804 <dt><span class="term">Throws:</span></dt>
805 <dd><p>
806 Nothing.
807 </p></dd>
808 <dt><span class="term">Note:</span></dt>
809 <dd><p>
810 same as <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a>
811 </p></dd>
812 </dl>
813 </div>
814 <p>
815 </p>
816 <h5>
817 <a name="algorithm_with_properties_has_ready_fibers_bridgehead"></a>
818 <span><a name="algorithm_with_properties_has_ready_fibers"></a></span>
819 <a class="link" href="scheduling.html#algorithm_with_properties_has_ready_fibers">Member
820 function <code class="computeroutput">has_ready_fibers</code>()</a>
821 </h5>
822 <p>
823 </p>
824 <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>
825 </pre>
826 <div class="variablelist">
827 <p class="title"><b></b></p>
828 <dl>
829 <dt><span class="term">Returns:</span></dt>
830 <dd><p>
831 <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
832 ready to run.
833 </p></dd>
834 <dt><span class="term">Throws:</span></dt>
835 <dd><p>
836 Nothing.
837 </p></dd>
838 <dt><span class="term">Note:</span></dt>
839 <dd><p>
840 same as <a class="link" href="scheduling.html#algorithm_has_ready_fibers"><code class="computeroutput">algorithm::has_ready_fibers()</code></a>
841 </p></dd>
842 </dl>
843 </div>
844 <p>
845 </p>
846 <h5>
847 <a name="algorithm_with_properties_suspend_until_bridgehead"></a>
848 <span><a name="algorithm_with_properties_suspend_until"></a></span>
849 <a class="link" href="scheduling.html#algorithm_with_properties_suspend_until">Member
850 function <code class="computeroutput">suspend_until</code>()</a>
851 </h5>
852 <p>
853 </p>
854 <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>
855 </pre>
856 <div class="variablelist">
857 <p class="title"><b></b></p>
858 <dl>
859 <dt><span class="term">Effects:</span></dt>
860 <dd><p>
861 Informs the scheduler that no fiber will be ready until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
862 </p></dd>
863 <dt><span class="term">Note:</span></dt>
864 <dd><p>
865 same as <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>
866 </p></dd>
867 </dl>
868 </div>
869 <p>
870 </p>
871 <h5>
872 <a name="algorithm_with_properties_notify_bridgehead"></a>
873 <span><a name="algorithm_with_properties_notify"></a></span>
874 <a class="link" href="scheduling.html#algorithm_with_properties_notify">Member
875 function <code class="computeroutput">notify</code>()</a>
876 </h5>
877 <p>
878 </p>
879 <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>
880 </pre>
881 <div class="variablelist">
882 <p class="title"><b></b></p>
883 <dl>
884 <dt><span class="term">Effects:</span></dt>
885 <dd><p>
886 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>.
887 </p></dd>
888 <dt><span class="term">Note:</span></dt>
889 <dd><p>
890 same as <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a>
891 </p></dd>
892 </dl>
893 </div>
894 <p>
895 </p>
896 <h5>
897 <a name="algorithm_with_properties_properties_bridgehead"></a>
898 <span><a name="algorithm_with_properties_properties"></a></span>
899 <a class="link" href="scheduling.html#algorithm_with_properties_properties">Member
900 function <code class="computeroutput">properties</code>()</a>
901 </h5>
902 <p>
903 </p>
904 <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>
905 </pre>
906 <div class="variablelist">
907 <p class="title"><b></b></p>
908 <dl>
909 <dt><span class="term">Returns:</span></dt>
910 <dd><p>
911 the <code class="computeroutput"><span class="identifier">PROPS</span></code> instance associated
912 with fiber <code class="computeroutput"><span class="identifier">f</span></code>.
913 </p></dd>
914 <dt><span class="term">Throws:</span></dt>
915 <dd><p>
916 Nothing.
917 </p></dd>
918 <dt><span class="term">Note:</span></dt>
919 <dd><p>
920 The fiber&#8217;s associated <code class="computeroutput"><span class="identifier">PROPS</span></code>
921 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
922 <a class="link" href="scheduling.html#algorithm_with_properties_property_change"><code class="computeroutput">algorithm_with_properties::property_change()</code></a>.
923 However, every <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> subclass is expected to track
924 a collection of ready <a class="link" href="scheduling.html#class_context"><code class="computeroutput">context</code></a> instances. This method allows
925 your custom scheduler to retrieve the <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a> subclass
926 instance for any <code class="computeroutput"><span class="identifier">context</span></code>
927 in its collection.
928 </p></dd>
929 </dl>
930 </div>
931 <p>
932 </p>
933 <h5>
934 <a name="algorithm_with_properties_property_change_bridgehead"></a>
935 <span><a name="algorithm_with_properties_property_change"></a></span>
936 <a class="link" href="scheduling.html#algorithm_with_properties_property_change">Member
937 function <code class="computeroutput">property_change</code>()</a>
938 </h5>
939 <p>
940 </p>
941 <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>
942 </pre>
943 <div class="variablelist">
944 <p class="title"><b></b></p>
945 <dl>
946 <dt><span class="term">Effects:</span></dt>
947 <dd><p>
948 Notify the custom scheduler of a possibly-relevant change to a property
949 belonging to fiber <code class="computeroutput"><span class="identifier">f</span></code>.
950 <code class="computeroutput"><span class="identifier">properties</span></code> contains the
951 new values of all relevant properties.
952 </p></dd>
953 <dt><span class="term">Throws:</span></dt>
954 <dd><p>
955 Nothing.
956 </p></dd>
957 <dt><span class="term">Note:</span></dt>
958 <dd><p>
959 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
960 explicitly calls <a class="link" href="scheduling.html#fiber_properties_notify"><code class="computeroutput">fiber_properties::notify()</code></a>.
961 </p></dd>
962 </dl>
963 </div>
964 <p>
965 </p>
966 <h5>
967 <a name="algorithm_with_properties_new_properties_bridgehead"></a>
968 <span><a name="algorithm_with_properties_new_properties"></a></span>
969 <a class="link" href="scheduling.html#algorithm_with_properties_new_properties">Member
970 function <code class="computeroutput">new_properties</code>()</a>
971 </h5>
972 <p>
973 </p>
974 <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>
975 </pre>
976 <div class="variablelist">
977 <p class="title"><b></b></p>
978 <dl>
979 <dt><span class="term">Returns:</span></dt>
980 <dd><p>
981 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>.
982 </p></dd>
983 <dt><span class="term">Note:</span></dt>
984 <dd><p>
985 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>
986 <span class="identifier">PROPS</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>,
987 placing the <code class="computeroutput"><span class="identifier">PROPS</span></code> instance
988 on the heap. Override this method to allocate <code class="computeroutput"><span class="identifier">PROPS</span></code>
989 some other way. The returned <code class="computeroutput"><span class="identifier">fiber_properties</span></code>
990 pointer must point to the <code class="computeroutput"><span class="identifier">PROPS</span></code>
991 instance to be associated with fiber <code class="computeroutput"><span class="identifier">f</span></code>.
992 </p></dd>
993 </dl>
994 </div>
995 <p>
996 <a name="context"></a></p>
997 <h5>
998 <a name="class_context_bridgehead"></a>
999 <span><a name="class_context"></a></span>
1000 <a class="link" href="scheduling.html#class_context">Class
1001 <code class="computeroutput">context</code></a>
1002 </h5>
1003 <p>
1004 </p>
1005 <p>
1006 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
1007 scheduler implementation.
1008 </p>
1009 <p>
1010 <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
1011 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>
1012 <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>.
1013 This hook is reserved for use by <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementations. (For
1014 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>
1015 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>,
1016 <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>.
1017 </p>
1018 <p>
1019 Your <code class="computeroutput"><span class="identifier">algorithm</span></code> implementation
1020 may use any container you desire to manage passed <code class="computeroutput"><span class="identifier">context</span></code>
1021 instances. <code class="computeroutput"><span class="identifier">ready_queue_t</span></code> avoids
1022 some of the overhead of typical STL containers.
1023 </p>
1024 <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>
1025
1026 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
1027 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
1028
1029 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">type</span> <span class="special">{</span>
1030 <span class="identifier">none</span> <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span>
1031 <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>
1032 <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>
1033 <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>
1034 <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>
1035 <span class="special">};</span>
1036
1037 <span class="keyword">class</span> <span class="identifier">context</span> <span class="special">{</span>
1038 <span class="keyword">public</span><span class="special">:</span>
1039 <span class="keyword">class</span> <span class="identifier">id</span><span class="special">;</span>
1040
1041 <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>
1042
1043 <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>
1044 <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>
1045
1046 <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>
1047
1048 <span class="keyword">void</span> <span class="identifier">detach</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1049 <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>
1050
1051 <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>
1052
1053 <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>
1054
1055 <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>
1056 <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>
1057 <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>
1058
1059 <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>
1060 <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>
1061 <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>
1062 <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>
1063 <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>
1064 <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>
1065
1066 <span class="keyword">void</span> <span class="identifier">ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1067 <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>
1068 <span class="keyword">void</span> <span class="identifier">wait_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1069
1070 <span class="keyword">void</span> <span class="identifier">suspend</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1071 <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>
1072 <span class="special">};</span>
1073
1074 <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>
1075
1076 <span class="special">}}</span>
1077 </pre>
1078 <p>
1079 </p>
1080 <h5>
1081 <a name="context_active_bridgehead"></a>
1082 <span><a name="context_active"></a></span>
1083 <a class="link" href="scheduling.html#context_active">Static member function
1084 <code class="computeroutput">active</code>()</a>
1085 </h5>
1086 <p>
1087 </p>
1088 <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>
1089 </pre>
1090 <div class="variablelist">
1091 <p class="title"><b></b></p>
1092 <dl>
1093 <dt><span class="term">Returns:</span></dt>
1094 <dd><p>
1095 Pointer to instance of current fiber.
1096 </p></dd>
1097 <dt><span class="term">Throws:</span></dt>
1098 <dd><p>
1099 Nothing
1100 </p></dd>
1101 </dl>
1102 </div>
1103 <p>
1104 </p>
1105 <h5>
1106 <a name="context_get_id_bridgehead"></a>
1107 <span><a name="context_get_id"></a></span>
1108 <a class="link" href="scheduling.html#context_get_id">Member function <code class="computeroutput">get_id</code>()</a>
1109 </h5>
1110 <p>
1111 </p>
1112 <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>
1113 </pre>
1114 <div class="variablelist">
1115 <p class="title"><b></b></p>
1116 <dl>
1117 <dt><span class="term">Returns:</span></dt>
1118 <dd><p>
1119 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1120 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
1121 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>.
1122 </p></dd>
1123 <dt><span class="term">Throws:</span></dt>
1124 <dd><p>
1125 Nothing
1126 </p></dd>
1127 <dt><span class="term">See also:</span></dt>
1128 <dd><p>
1129 <a class="link" href="fiber_mgmt/fiber.html#fiber_get_id"><code class="computeroutput">fiber::get_id()</code></a>
1130 </p></dd>
1131 </dl>
1132 </div>
1133 <p>
1134 </p>
1135 <h5>
1136 <a name="context_attach_bridgehead"></a>
1137 <span><a name="context_attach"></a></span>
1138 <a class="link" href="scheduling.html#context_attach">Member function <code class="computeroutput">attach</code>()</a>
1139 </h5>
1140 <p>
1141 </p>
1142 <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>
1143 </pre>
1144 <div class="variablelist">
1145 <p class="title"><b></b></p>
1146 <dl>
1147 <dt><span class="term">Precondition:</span></dt>
1148 <dd><p>
1149 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1150 <span class="special">==</span> <span class="keyword">nullptr</span></code>
1151 </p></dd>
1152 <dt><span class="term">Effects:</span></dt>
1153 <dd><p>
1154 Attach fiber <code class="computeroutput"><span class="identifier">f</span></code> to scheduler
1155 running <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1156 </p></dd>
1157 <dt><span class="term">Postcondition:</span></dt>
1158 <dd><p>
1159 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1160 <span class="special">!=</span> <span class="keyword">nullptr</span></code>
1161 </p></dd>
1162 <dt><span class="term">Throws:</span></dt>
1163 <dd><p>
1164 Nothing
1165 </p></dd>
1166 <dt><span class="term">Note:</span></dt>
1167 <dd><p>
1168 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>
1169 </p></dd>
1170 <dt><span class="term">Note:</span></dt>
1171 <dd><p>
1172 <code class="computeroutput"><span class="identifier">f</span></code> must not be the running
1173 fiber&#8217;s context. It must not be <a class="link" href="overview.html#blocking"><span class="emphasis"><em>blocked</em></span></a>
1174 or terminated. It must not be a <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1175 It must be currently detached. It must not currently be linked into an
1176 <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation&#8217;s ready queue. Most of these conditions
1177 are implied by <code class="computeroutput"><span class="identifier">f</span></code> being
1178 owned by an <code class="computeroutput"><span class="identifier">algorithm</span></code>
1179 implementation: that is, it has been passed to <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a> but
1180 has not yet been returned by <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a>.
1181 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>
1182 with the <code class="computeroutput"><span class="identifier">context</span><span class="special">*</span></code>
1183 it is about to return. It must first remove <code class="computeroutput"><span class="identifier">f</span></code>
1184 from its ready queue. You should never pass a <code class="computeroutput"><span class="identifier">pinned_context</span></code>
1185 to <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code>
1186 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.
1187 </p></dd>
1188 </dl>
1189 </div>
1190 <p>
1191 </p>
1192 <h5>
1193 <a name="context_detach_bridgehead"></a>
1194 <span><a name="context_detach"></a></span>
1195 <a class="link" href="scheduling.html#context_detach">Member function <code class="computeroutput">detach</code>()</a>
1196 </h5>
1197 <p>
1198 </p>
1199 <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>
1200 </pre>
1201 <div class="variablelist">
1202 <p class="title"><b></b></p>
1203 <dl>
1204 <dt><span class="term">Precondition:</span></dt>
1205 <dd><p>
1206 <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>
1207 <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>
1208 </p></dd>
1209 <dt><span class="term">Effects:</span></dt>
1210 <dd><p>
1211 Detach fiber <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1212 from its scheduler running <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1213 </p></dd>
1214 <dt><span class="term">Throws:</span></dt>
1215 <dd><p>
1216 Nothing
1217 </p></dd>
1218 <dt><span class="term">Postcondition:</span></dt>
1219 <dd><p>
1220 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1221 <span class="special">==</span> <span class="keyword">nullptr</span></code>
1222 </p></dd>
1223 <dt><span class="term">Note:</span></dt>
1224 <dd><p>
1225 This method must be called on the thread with which the fiber is currently
1226 associated. <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1227 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>
1228 or terminated. It must not be a <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1229 It must not be detached already. It must not already be linked into an
1230 <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation&#8217;s ready queue. Most of these conditions
1231 are implied by <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1232 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>
1233 implementation must, however, test for <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1234 It must call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code>
1235 <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.
1236 </p></dd>
1237 <dt><span class="term">Note:</span></dt>
1238 <dd><p>
1239 In particular, it is erroneous to attempt to migrate a fiber from one
1240 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.
1241 <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>
1242 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
1243 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>
1244 method.
1245 </p></dd>
1246 <dt><span class="term">Note:</span></dt>
1247 <dd><p>
1248 Unless you intend make a fiber available for potential migration to a
1249 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>.
1250 </p></dd>
1251 </dl>
1252 </div>
1253 <p>
1254 </p>
1255 <h5>
1256 <a name="context_is_context_bridgehead"></a>
1257 <span><a name="context_is_context"></a></span>
1258 <a class="link" href="scheduling.html#context_is_context">Member function
1259 <code class="computeroutput">is_context</code>()</a>
1260 </h5>
1261 <p>
1262 </p>
1263 <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>
1264 </pre>
1265 <div class="variablelist">
1266 <p class="title"><b></b></p>
1267 <dl>
1268 <dt><span class="term">Returns:</span></dt>
1269 <dd><p>
1270 <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.
1271 </p></dd>
1272 <dt><span class="term">Throws:</span></dt>
1273 <dd><p>
1274 Nothing
1275 </p></dd>
1276 <dt><span class="term">Note:</span></dt>
1277 <dd><p>
1278 <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="identifier">worker_context</span></code> here means any fiber
1279 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>
1280 the <code class="computeroutput"><span class="identifier">context</span></code> is associated
1281 with the <span class="quote">&#8220;<span class="quote">main</span>&#8221;</span> fiber of the thread: the one implicitly
1282 created by the thread itself, rather than one explicitly created by
1283 <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>
1284 the <code class="computeroutput"><span class="identifier">context</span></code> is associated
1285 with a <span class="quote">&#8220;<span class="quote">dispatching</span>&#8221;</span> fiber, responsible for dispatching
1286 awakened fibers to a scheduler&#8217;s ready-queue. The <span class="quote">&#8220;<span class="quote">dispatching</span>&#8221;</span>
1287 fiber is an implementation detail of the fiber manager. The context of
1288 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
1289 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>
1290 &#8212; must never be passed to <a class="link" href="scheduling.html#context_detach"><code class="computeroutput">context::detach()</code></a>.
1291 </p></dd>
1292 </dl>
1293 </div>
1294 <p>
1295 </p>
1296 <h5>
1297 <a name="context_is_terminated_bridgehead"></a>
1298 <span><a name="context_is_terminated"></a></span>
1299 <a class="link" href="scheduling.html#context_is_terminated">Member
1300 function <code class="computeroutput">is_terminated</code>()</a>
1301 </h5>
1302 <p>
1303 </p>
1304 <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>
1305 </pre>
1306 <div class="variablelist">
1307 <p class="title"><b></b></p>
1308 <dl>
1309 <dt><span class="term">Returns:</span></dt>
1310 <dd><p>
1311 <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.
1312 </p></dd>
1313 <dt><span class="term">Throws:</span></dt>
1314 <dd><p>
1315 Nothing
1316 </p></dd>
1317 <dt><span class="term">Note:</span></dt>
1318 <dd><p>
1319 The <code class="computeroutput"><span class="identifier">context</span></code> has returned
1320 from its fiber-function and is no longer considered a valid context.
1321 </p></dd>
1322 </dl>
1323 </div>
1324 <p>
1325 </p>
1326 <h5>
1327 <a name="context_ready_is_linked_bridgehead"></a>
1328 <span><a name="context_ready_is_linked"></a></span>
1329 <a class="link" href="scheduling.html#context_ready_is_linked">Member
1330 function <code class="computeroutput">ready_is_linked</code>()</a>
1331 </h5>
1332 <p>
1333 </p>
1334 <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>
1335 </pre>
1336 <div class="variablelist">
1337 <p class="title"><b></b></p>
1338 <dl>
1339 <dt><span class="term">Returns:</span></dt>
1340 <dd><p>
1341 <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>
1342 implementation&#8217;s
1343 ready-queue.
1344 </p></dd>
1345 <dt><span class="term">Throws:</span></dt>
1346 <dd><p>
1347 Nothing
1348 </p></dd>
1349 <dt><span class="term">Note:</span></dt>
1350 <dd><p>
1351 Specifically, this method indicates whether <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a> has
1352 been called on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1353 <code class="computeroutput"><span class="identifier">ready_is_linked</span><span class="special">()</span></code>
1354 has no information about participation in any other containers.
1355 </p></dd>
1356 </dl>
1357 </div>
1358 <p>
1359 </p>
1360 <h5>
1361 <a name="context_remote_ready_is_linked_bridgehead"></a>
1362 <span><a name="context_remote_ready_is_linked"></a></span>
1363 <a class="link" href="scheduling.html#context_remote_ready_is_linked">Member
1364 function <code class="computeroutput">remote_ready_is_linked</code>()</a>
1365 </h5>
1366 <p>
1367 </p>
1368 <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>
1369 </pre>
1370 <div class="variablelist">
1371 <p class="title"><b></b></p>
1372 <dl>
1373 <dt><span class="term">Returns:</span></dt>
1374 <dd><p>
1375 <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.
1376 </p></dd>
1377 <dt><span class="term">Throws:</span></dt>
1378 <dd><p>
1379 Nothing
1380 </p></dd>
1381 <dt><span class="term">Note:</span></dt>
1382 <dd><p>
1383 A <code class="computeroutput"><span class="identifier">context</span></code> signaled as
1384 ready by another thread is first stored in the fiber manager&#8217;s remote-ready-queue.
1385 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
1386 from cross-thread <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a> calls.
1387 </p></dd>
1388 </dl>
1389 </div>
1390 <p>
1391 </p>
1392 <h5>
1393 <a name="context_wait_is_linked_bridgehead"></a>
1394 <span><a name="context_wait_is_linked"></a></span>
1395 <a class="link" href="scheduling.html#context_wait_is_linked">Member
1396 function <code class="computeroutput">wait_is_linked</code>()</a>
1397 </h5>
1398 <p>
1399 </p>
1400 <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>
1401 </pre>
1402 <div class="variablelist">
1403 <p class="title"><b></b></p>
1404 <dl>
1405 <dt><span class="term">Returns:</span></dt>
1406 <dd><p>
1407 <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
1408 synchronization object.
1409 </p></dd>
1410 <dt><span class="term">Throws:</span></dt>
1411 <dd><p>
1412 Nothing
1413 </p></dd>
1414 <dt><span class="term">Note:</span></dt>
1415 <dd><p>
1416 The <code class="computeroutput"><span class="identifier">context</span></code> of a fiber
1417 waiting on a synchronization object (e.g. <code class="computeroutput"><span class="identifier">mutex</span></code>,
1418 <code class="computeroutput"><span class="identifier">condition_variable</span></code> etc.)
1419 is stored in the wait-queue of that synchronization object.
1420 </p></dd>
1421 </dl>
1422 </div>
1423 <p>
1424 </p>
1425 <h5>
1426 <a name="context_ready_link_bridgehead"></a>
1427 <span><a name="context_ready_link"></a></span>
1428 <a class="link" href="scheduling.html#context_ready_link">Member function
1429 <code class="computeroutput">ready_link</code>()</a>
1430 </h5>
1431 <p>
1432 </p>
1433 <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>
1434 <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>
1435 </pre>
1436 <div class="variablelist">
1437 <p class="title"><b></b></p>
1438 <dl>
1439 <dt><span class="term">Effects:</span></dt>
1440 <dd><p>
1441 Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1442 in ready-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1443 </p></dd>
1444 <dt><span class="term">Throws:</span></dt>
1445 <dd><p>
1446 Nothing
1447 </p></dd>
1448 <dt><span class="term">Note:</span></dt>
1449 <dd><p>
1450 Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1451 a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>,
1452 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>.
1453 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.
1454 </p></dd>
1455 </dl>
1456 </div>
1457 <p>
1458 </p>
1459 <h5>
1460 <a name="context_remote_ready_link_bridgehead"></a>
1461 <span><a name="context_remote_ready_link"></a></span>
1462 <a class="link" href="scheduling.html#context_remote_ready_link">Member
1463 function <code class="computeroutput">remote_ready_link</code>()</a>
1464 </h5>
1465 <p>
1466 </p>
1467 <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>
1468 <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>
1469 </pre>
1470 <div class="variablelist">
1471 <p class="title"><b></b></p>
1472 <dl>
1473 <dt><span class="term">Effects:</span></dt>
1474 <dd><p>
1475 Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1476 in remote-ready-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1477 </p></dd>
1478 <dt><span class="term">Throws:</span></dt>
1479 <dd><p>
1480 Nothing
1481 </p></dd>
1482 <dt><span class="term">Note:</span></dt>
1483 <dd><p>
1484 Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1485 a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>.
1486 </p></dd>
1487 </dl>
1488 </div>
1489 <p>
1490 </p>
1491 <h5>
1492 <a name="context_wait_link_bridgehead"></a>
1493 <span><a name="context_wait_link"></a></span>
1494 <a class="link" href="scheduling.html#context_wait_link">Member function
1495 <code class="computeroutput">wait_link</code>()</a>
1496 </h5>
1497 <p>
1498 </p>
1499 <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>
1500 <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>
1501 </pre>
1502 <div class="variablelist">
1503 <p class="title"><b></b></p>
1504 <dl>
1505 <dt><span class="term">Effects:</span></dt>
1506 <dd><p>
1507 Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1508 in wait-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1509 </p></dd>
1510 <dt><span class="term">Throws:</span></dt>
1511 <dd><p>
1512 Nothing
1513 </p></dd>
1514 <dt><span class="term">Note:</span></dt>
1515 <dd><p>
1516 Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1517 a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>.
1518 </p></dd>
1519 </dl>
1520 </div>
1521 <p>
1522 </p>
1523 <h5>
1524 <a name="context_ready_unlink_bridgehead"></a>
1525 <span><a name="context_ready_unlink"></a></span>
1526 <a class="link" href="scheduling.html#context_ready_unlink">Member
1527 function <code class="computeroutput">ready_unlink</code>()</a>
1528 </h5>
1529 <p>
1530 </p>
1531 <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>
1532 </pre>
1533 <div class="variablelist">
1534 <p class="title"><b></b></p>
1535 <dl>
1536 <dt><span class="term">Effects:</span></dt>
1537 <dd><p>
1538 Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1539 from ready-queue: undoes the effect of <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a>.
1540 </p></dd>
1541 <dt><span class="term">Throws:</span></dt>
1542 <dd><p>
1543 Nothing
1544 </p></dd>
1545 </dl>
1546 </div>
1547 <p>
1548 </p>
1549 <h5>
1550 <a name="context_remote_ready_unlink_bridgehead"></a>
1551 <span><a name="context_remote_ready_unlink"></a></span>
1552 <a class="link" href="scheduling.html#context_remote_ready_unlink">Member
1553 function <code class="computeroutput">remote_ready_unlink</code>()</a>
1554 </h5>
1555 <p>
1556 </p>
1557 <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>
1558 </pre>
1559 <div class="variablelist">
1560 <p class="title"><b></b></p>
1561 <dl>
1562 <dt><span class="term">Effects:</span></dt>
1563 <dd><p>
1564 Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1565 from remote-ready-queue.
1566 </p></dd>
1567 <dt><span class="term">Throws:</span></dt>
1568 <dd><p>
1569 Nothing
1570 </p></dd>
1571 </dl>
1572 </div>
1573 <p>
1574 </p>
1575 <h5>
1576 <a name="context_wait_unlink_bridgehead"></a>
1577 <span><a name="context_wait_unlink"></a></span>
1578 <a class="link" href="scheduling.html#context_wait_unlink">Member
1579 function <code class="computeroutput">wait_unlink</code>()</a>
1580 </h5>
1581 <p>
1582 </p>
1583 <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>
1584 </pre>
1585 <div class="variablelist">
1586 <p class="title"><b></b></p>
1587 <dl>
1588 <dt><span class="term">Effects:</span></dt>
1589 <dd><p>
1590 Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1591 from wait-queue.
1592 </p></dd>
1593 <dt><span class="term">Throws:</span></dt>
1594 <dd><p>
1595 Nothing
1596 </p></dd>
1597 </dl>
1598 </div>
1599 <p>
1600 </p>
1601 <h5>
1602 <a name="context_suspend_bridgehead"></a>
1603 <span><a name="context_suspend"></a></span>
1604 <a class="link" href="scheduling.html#context_suspend">Member function <code class="computeroutput">suspend</code>()</a>
1605 </h5>
1606 <p>
1607 </p>
1608 <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>
1609 </pre>
1610 <div class="variablelist">
1611 <p class="title"><b></b></p>
1612 <dl>
1613 <dt><span class="term">Effects:</span></dt>
1614 <dd><p>
1615 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>.
1616 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1617 is marked as not-ready, and control passes to the scheduler to select
1618 another fiber to run.
1619 </p></dd>
1620 <dt><span class="term">Throws:</span></dt>
1621 <dd><p>
1622 Nothing
1623 </p></dd>
1624 <dt><span class="term">Note:</span></dt>
1625 <dd><p>
1626 This is a low-level API potentially useful for integration with other
1627 frameworks. It is not intended to be directly invoked by a typical application
1628 program.
1629 </p></dd>
1630 <dt><span class="term">Note:</span></dt>
1631 <dd><p>
1632 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>
1633 at some future time.
1634 </p></dd>
1635 </dl>
1636 </div>
1637 <p>
1638 </p>
1639 <h5>
1640 <a name="context_set_ready_bridgehead"></a>
1641 <span><a name="context_set_ready"></a></span>
1642 <a class="link" href="scheduling.html#context_set_ready">Member function
1643 <code class="computeroutput">set_ready</code>()</a>
1644 </h5>
1645 <p>
1646 </p>
1647 <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>
1648 </pre>
1649 <div class="variablelist">
1650 <p class="title"><b></b></p>
1651 <dl>
1652 <dt><span class="term">Effects:</span></dt>
1653 <dd><p>
1654 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
1655 not immediately resume that fiber; rather it passes the fiber to the
1656 scheduler for subsequent resumption. If the scheduler is idle (has not
1657 returned from a call to <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>),
1658 <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a> is called to wake it up.
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 This is a low-level API potentially useful for integration with other
1667 frameworks. It is not intended to be directly invoked by a typical application
1668 program.
1669 </p></dd>
1670 <dt><span class="term">Note:</span></dt>
1671 <dd><p>
1672 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
1673 which <code class="computeroutput"><span class="special">*</span><span class="identifier">ctx</span></code>
1674 is currently suspended. The corresponding fiber will be resumed on its
1675 original thread in due course.
1676 </p></dd>
1677 </dl>
1678 </div>
1679 <p>
1680 </p>
1681 <h5>
1682 <a name="context_less_bridgehead"></a>
1683 <span><a name="context_less"></a></span>
1684 <a class="link" href="scheduling.html#context_less">Non-member function <code class="computeroutput">operator&lt;()</code></a>
1685 </h5>
1686 <p>
1687 </p>
1688 <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>
1689 </pre>
1690 <div class="variablelist">
1691 <p class="title"><b></b></p>
1692 <dl>
1693 <dt><span class="term">Returns:</span></dt>
1694 <dd><p>
1695 <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>
1696 is <code class="computeroutput"><span class="keyword">true</span></code>, <code class="computeroutput"><span class="keyword">false</span></code>
1697 otherwise.
1698 </p></dd>
1699 <dt><span class="term">Throws:</span></dt>
1700 <dd><p>
1701 Nothing.
1702 </p></dd>
1703 </dl>
1704 </div>
1705 </div>
1706 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1707 <td align="left"></td>
1708 <td align="right"><div class="copyright-footer">Copyright &#169; 2013 Oliver Kowalke<p>
1709 Distributed under the Boost Software License, Version 1.0. (See accompanying
1710 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>)
1711 </p>
1712 </div></td>
1713 </tr></table>
1714 <hr>
1715 <div class="spirit-nav">
1716 <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>
1717 </div>
1718 </body>
1719 </html>