]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/fiber/doc/html/fiber/synchronization/channels.html
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / fiber / doc / html / fiber / synchronization / channels.html
CommitLineData
7c673cae
FG
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4<title>Channels</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="../synchronization.html" title="Synchronization">
9<link rel="prev" href="barriers.html" title="Barriers">
10<link rel="next" href="futures.html" title="Futures">
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="barriers.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../synchronization.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="futures.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h3 class="title">
27<a name="fiber.synchronization.channels"></a><a class="link" href="channels.html" title="Channels">Channels</a>
28</h3></div></div></div>
29<p>
30 <span class="bold"><strong>Boost.Fiber</strong></span> provides a bounded and a unbounded
31 channel suitable to synchonize fibers via message passing.
32 </p>
33<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">unbounded_channel</span><span class="special">&lt;</span> <span class="keyword">int</span> <span class="special">&gt;</span> <span class="identifier">channel_t</span><span class="special">;</span>
34
35<span class="keyword">void</span> <span class="identifier">send</span><span class="special">(</span> <span class="identifier">channel_t</span> <span class="special">&amp;</span> <span class="identifier">channel</span><span class="special">)</span> <span class="special">{</span>
36 <span class="keyword">for</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="number">5</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
37 <span class="identifier">channel</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span> <span class="identifier">i</span><span class="special">);</span>
38 <span class="special">}</span>
39 <span class="identifier">channel</span><span class="special">.</span><span class="identifier">close</span><span class="special">();</span>
40<span class="special">}</span>
41
42<span class="keyword">void</span> <span class="identifier">recv</span><span class="special">(</span> <span class="identifier">channel_t</span> <span class="special">&amp;</span> <span class="identifier">channel</span><span class="special">)</span> <span class="special">{</span>
43 <span class="keyword">int</span> <span class="identifier">i</span><span class="special">;</span>
44 <span class="keyword">while</span> <span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">channel_op_status</span><span class="special">::</span><span class="identifier">success</span> <span class="special">==</span> <span class="identifier">channel</span><span class="special">.</span><span class="identifier">pop</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span>
45 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">&lt;&lt;</span> <span class="string">"received "</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span> <span class="special">&lt;&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
46 <span class="special">}</span>
47<span class="special">}</span>
48
49<span class="identifier">channel_t</span> <span class="identifier">channel</span><span class="special">;</span>
50<span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">fiber</span> <span class="identifier">f1</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span> <span class="identifier">send</span><span class="special">,</span> <span class="identifier">ref</span><span class="special">(</span> <span class="identifier">channel</span><span class="special">)</span> <span class="special">)</span> <span class="special">);</span>
51<span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">fiber</span> <span class="identifier">f2</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span> <span class="identifier">recv</span><span class="special">,</span> <span class="identifier">ref</span><span class="special">(</span> <span class="identifier">channel</span><span class="special">)</span> <span class="special">)</span> <span class="special">);</span>
52
53<span class="identifier">f1</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
54<span class="identifier">f2</span><span class="special">.</span><span class="identifier">join</span><span class="special">();</span>
55</pre>
56<a name="class_channel_op_status"></a><h5>
57<a name="fiber.synchronization.channels.h0"></a>
58 <span><a name="fiber.synchronization.channels.enumeration__code__phrase_role__identifier__channel_op_status__phrase___code_"></a></span><a class="link" href="channels.html#fiber.synchronization.channels.enumeration__code__phrase_role__identifier__channel_op_status__phrase___code_">Enumeration
59 <code class="computeroutput"><span class="identifier">channel_op_status</span></code></a>
60 </h5>
61<p>
62 channel operations return the state of the channel.
63 </p>
64<pre class="programlisting"><span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">channel_op_status</span> <span class="special">{</span>
65 <span class="identifier">success</span><span class="special">,</span>
66 <span class="identifier">empty</span><span class="special">,</span>
67 <span class="identifier">full</span><span class="special">,</span>
68 <span class="identifier">closed</span><span class="special">,</span>
69 <span class="identifier">timeout</span>
70<span class="special">};</span>
71</pre>
72<h5>
73<a name="fiber.synchronization.channels.h1"></a>
74 <span><a name="fiber.synchronization.channels._code__phrase_role__identifier__success__phrase___code_"></a></span><a class="link" href="channels.html#fiber.synchronization.channels._code__phrase_role__identifier__success__phrase___code_"><code class="computeroutput"><span class="identifier">success</span></code></a>
75 </h5>
76<div class="variablelist">
77<p class="title"><b></b></p>
78<dl>
79<dt><span class="term">Effects:</span></dt>
80<dd><p>
81 Operation was successful.
82 </p></dd>
83</dl>
84</div>
85<h5>
86<a name="fiber.synchronization.channels.h2"></a>
87 <span><a name="fiber.synchronization.channels._code__phrase_role__identifier__empty__phrase___code_"></a></span><a class="link" href="channels.html#fiber.synchronization.channels._code__phrase_role__identifier__empty__phrase___code_"><code class="computeroutput"><span class="identifier">empty</span></code></a>
88 </h5>
89<div class="variablelist">
90<p class="title"><b></b></p>
91<dl>
92<dt><span class="term">Effects:</span></dt>
93<dd><p>
94 channel is empty, operation failed.
95 </p></dd>
96</dl>
97</div>
98<h5>
99<a name="fiber.synchronization.channels.h3"></a>
100 <span><a name="fiber.synchronization.channels._code__phrase_role__identifier__full__phrase___code_"></a></span><a class="link" href="channels.html#fiber.synchronization.channels._code__phrase_role__identifier__full__phrase___code_"><code class="computeroutput"><span class="identifier">full</span></code></a>
101 </h5>
102<div class="variablelist">
103<p class="title"><b></b></p>
104<dl>
105<dt><span class="term">Effects:</span></dt>
106<dd><p>
107 channel is full, operation failed.
108 </p></dd>
109</dl>
110</div>
111<h5>
112<a name="fiber.synchronization.channels.h4"></a>
113 <span><a name="fiber.synchronization.channels._code__phrase_role__identifier__closed__phrase___code_"></a></span><a class="link" href="channels.html#fiber.synchronization.channels._code__phrase_role__identifier__closed__phrase___code_"><code class="computeroutput"><span class="identifier">closed</span></code></a>
114 </h5>
115<div class="variablelist">
116<p class="title"><b></b></p>
117<dl>
118<dt><span class="term">Effects:</span></dt>
119<dd><p>
120 channel is closed, operation failed.
121 </p></dd>
122</dl>
123</div>
124<h5>
125<a name="fiber.synchronization.channels.h5"></a>
126 <span><a name="fiber.synchronization.channels._code__phrase_role__identifier__timeout__phrase___code_"></a></span><a class="link" href="channels.html#fiber.synchronization.channels._code__phrase_role__identifier__timeout__phrase___code_"><code class="computeroutput"><span class="identifier">timeout</span></code></a>
127 </h5>
128<div class="variablelist">
129<p class="title"><b></b></p>
130<dl>
131<dt><span class="term">Effects:</span></dt>
132<dd><p>
133 The operation did not become ready before specified timeout elapsed.
134 </p></dd>
135</dl>
136</div>
137<p>
138 </p>
139<h5>
140<a name="class_unbounded_channel_bridgehead"></a>
141 <span><a name="class_unbounded_channel"></a></span>
142 <a class="link" href="channels.html#class_unbounded_channel">Template
143 <code class="computeroutput">unbounded_channel&lt;&gt;</code></a>
144</h5>
145<p>
146 </p>
147<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">unbounded_channel</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
148
149<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
150<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
151
152<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> <span class="special">=</span> <a href="http://en.cppreference.com/w/cpp/memory/allocator" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span></code></a> <span class="special">&gt;</span>
153<span class="keyword">class</span> <span class="identifier">unbounded_channel</span> <span class="special">{</span>
154<span class="keyword">public</span><span class="special">:</span>
155 <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span>
156
157 <span class="keyword">explicit</span> <span class="identifier">unbounded_channel</span><span class="special">(</span> <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span> <span class="special">=</span> <span class="identifier">Allocator</span><span class="special">()</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
158
159 <span class="identifier">unbounded_channel</span><span class="special">(</span> <span class="identifier">unbounded_channel</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
160 <span class="identifier">unbounded_channel</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">unbounded_channel</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
161
162 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
163
164 <span class="identifier">channel_op_status</span> <span class="identifier">push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
165 <span class="identifier">channel_op_status</span> <span class="identifier">push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">);</span>
166
167 <span class="identifier">channel_op_status</span> <span class="identifier">pop</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
168 <span class="identifier">value_type</span> <span class="identifier">value_pop</span><span class="special">();</span>
169 <span class="identifier">channel_op_status</span> <span class="identifier">try_pop</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
170 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
171 <span class="identifier">channel_op_status</span> <span class="identifier">pop_wait_for</span><span class="special">(</span>
172 <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
173 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
174 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
175 <span class="identifier">channel_op_status</span> <span class="identifier">pop_wait_until</span><span class="special">(</span>
176 <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
177 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
178<span class="special">};</span>
179
180<span class="special">}}</span>
181</pre>
182<h5>
183<a name="fiber.synchronization.channels.h6"></a>
184 <span><a name="fiber.synchronization.channels.constructor"></a></span><a class="link" href="channels.html#fiber.synchronization.channels.constructor">Constructor</a>
185 </h5>
186<pre class="programlisting"><span class="keyword">explicit</span> <span class="identifier">unbounded_channel</span><span class="special">(</span> <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span> <span class="special">=</span> <span class="identifier">Allocator</span><span class="special">()</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
187</pre>
188<div class="variablelist">
189<p class="title"><b></b></p>
190<dl>
191<dt><span class="term">Effects:</span></dt>
192<dd><p>
193 Constructs an object of class <code class="computeroutput"><span class="identifier">unbounded_channel</span></code>.
194 Internal nodes are allocated using <code class="computeroutput"><span class="identifier">alloc</span></code>
195 - C++11-allocators are supported.
196 </p></dd>
197<dt><span class="term">Throws:</span></dt>
198<dd><p>
199 Nothing.
200 </p></dd>
201<dt><span class="term">See also:</span></dt>
202<dd><p>
203 <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> concept, <a href="http://en.cppreference.com/w/cpp/memory/allocator" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special">&lt;</span>
204 <span class="identifier">T</span> <span class="special">&gt;</span></code></a>
205 </p></dd>
206</dl>
207</div>
208<p>
209 </p>
210<h5>
211<a name="unbounded_channel_close_bridgehead"></a>
212 <span><a name="unbounded_channel_close"></a></span>
213 <a class="link" href="channels.html#unbounded_channel_close">Member
214 function <code class="computeroutput">close</code>()</a>
215</h5>
216<p>
217 </p>
218<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
219</pre>
220<div class="variablelist">
221<p class="title"><b></b></p>
222<dl>
223<dt><span class="term">Effects:</span></dt>
224<dd><p>
225 Deactivates the channel. No values can be put after calling <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">close</span><span class="special">()</span></code>.
226 Fibers blocked in <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_for</span><span class="special">()</span></code> or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_until</span><span class="special">()</span></code> will return <code class="computeroutput"><span class="identifier">closed</span></code>.
227 Fibers blocked in <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">value_pop</span><span class="special">()</span></code> will receive an exception.
228 </p></dd>
229<dt><span class="term">Throws:</span></dt>
230<dd><p>
231 Nothing.
232 </p></dd>
233<dt><span class="term">Note:</span></dt>
234<dd><p>
235 <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>
236 is like closing a pipe. It informs waiting consumers that no more values
237 will arrive.
238 </p></dd>
239</dl>
240</div>
241<p>
242 </p>
243<h5>
244<a name="unbounded_channel_push_bridgehead"></a>
245 <span><a name="unbounded_channel_push"></a></span>
246 <a class="link" href="channels.html#unbounded_channel_push">Member
247 function <code class="computeroutput">push</code>()</a>
248</h5>
249<p>
250 </p>
251<pre class="programlisting"><span class="identifier">channel_op_status</span> <span class="identifier">push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
252<span class="identifier">channel_op_status</span> <span class="identifier">push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">);</span>
253</pre>
254<div class="variablelist">
255<p class="title"><b></b></p>
256<dl>
257<dt><span class="term">Effects:</span></dt>
258<dd><p>
259 If channel is closed, returns <code class="computeroutput"><span class="identifier">closed</span></code>.
260 Otherwise enqueues the value in the channel, wakes up a fiber blocked
261 on <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop</span><span class="special">()</span></code>,
262 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">value_pop</span><span class="special">()</span></code>,
263 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_for</span><span class="special">()</span></code>
264 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_until</span><span class="special">()</span></code>
265 and returns <code class="computeroutput"><span class="identifier">success</span></code>.
266 </p></dd>
267<dt><span class="term">Throws:</span></dt>
268<dd><p>
269 Exceptions thrown by memory allocation and copying or moving <code class="computeroutput"><span class="identifier">va</span></code>.
270 </p></dd>
271</dl>
272</div>
273<p>
274 </p>
275<h5>
276<a name="unbounded_channel_pop_bridgehead"></a>
277 <span><a name="unbounded_channel_pop"></a></span>
278 <a class="link" href="channels.html#unbounded_channel_pop">Member
279 function <code class="computeroutput">pop</code>()</a>
280</h5>
281<p>
282 </p>
283<pre class="programlisting"><span class="identifier">channel_op_status</span> <span class="identifier">pop</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
284</pre>
285<div class="variablelist">
286<p class="title"><b></b></p>
287<dl>
288<dt><span class="term">Effects:</span></dt>
289<dd><p>
290 Dequeues a value from the channel. If the channel is empty, the fiber
291 gets suspended until at least one new item is <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>ed (return value <code class="computeroutput"><span class="identifier">success</span></code>
292 and <code class="computeroutput"><span class="identifier">va</span></code> contains dequeued
293 value) or the channel gets <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>).
294 </p></dd>
295<dt><span class="term">Throws:</span></dt>
296<dd><p>
297 Nothing
298 </p></dd>
299</dl>
300</div>
301<p>
302 </p>
303<h5>
304<a name="unbounded_channel_value_pop_bridgehead"></a>
305 <span><a name="unbounded_channel_value_pop"></a></span>
306 <a class="link" href="channels.html#unbounded_channel_value_pop">Member
307 function <code class="computeroutput">value_pop</code>()</a>
308</h5>
309<p>
310 </p>
311<pre class="programlisting"><span class="identifier">value_type</span> <span class="identifier">value_pop</span><span class="special">();</span>
312</pre>
313<div class="variablelist">
314<p class="title"><b></b></p>
315<dl>
316<dt><span class="term">Effects:</span></dt>
317<dd><p>
318 Dequeues a value from the channel. If the channel is empty, the fiber
319 gets suspended until at least one new item is <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>ed or the channel gets <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d
320 (which throws an exception).
321 </p></dd>
322<dt><span class="term">Throws:</span></dt>
323<dd><p>
324 <code class="computeroutput"><span class="identifier">fiber_error</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
325 is closed
326 </p></dd>
327<dt><span class="term">Error conditions:</span></dt>
328<dd><p>
329 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_not_permitted</span></code>
330 </p></dd>
331</dl>
332</div>
333<p>
334 </p>
335<h5>
336<a name="unbounded_channel_try_pop_bridgehead"></a>
337 <span><a name="unbounded_channel_try_pop"></a></span>
338 <a class="link" href="channels.html#unbounded_channel_try_pop">Member
339 function <code class="computeroutput">try_pop</code>()</a>
340</h5>
341<p>
342 </p>
343<pre class="programlisting"><span class="identifier">channel_op_status</span> <span class="identifier">try_pop</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
344</pre>
345<div class="variablelist">
346<p class="title"><b></b></p>
347<dl>
348<dt><span class="term">Effects:</span></dt>
349<dd><p>
350 If channel is empty, returns <code class="computeroutput"><span class="identifier">empty</span></code>.
351 If channel is closed, returns <code class="computeroutput"><span class="identifier">closed</span></code>.
352 Otherwise it returns <code class="computeroutput"><span class="identifier">success</span></code>
353 and <code class="computeroutput"><span class="identifier">va</span></code> contains the
354 dequeued value.
355 </p></dd>
356<dt><span class="term">Throws:</span></dt>
357<dd><p>
358 Exceptions thrown by copy- or move-operations.
359 </p></dd>
360</dl>
361</div>
362<p>
363 </p>
364<h5>
365<a name="unbounded_channel_pop_wait_for_bridgehead"></a>
366 <span><a name="unbounded_channel_pop_wait_for"></a></span>
367 <a class="link" href="channels.html#unbounded_channel_pop_wait_for">Member
368 function <code class="computeroutput">pop_wait_for</code>()</a>
369</h5>
370<p>
371 </p>
372<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
373<span class="identifier">channel_op_status</span> <span class="identifier">pop_wait_for</span><span class="special">(</span>
374 <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
375 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">)</span>
376</pre>
377<div class="variablelist">
378<p class="title"><b></b></p>
379<dl>
380<dt><span class="term">Effects:</span></dt>
381<dd><p>
382 Accepts <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code> and internally computes
383 a timeout time as (system time + <code class="computeroutput"><span class="identifier">timeout_duration</span></code>).
384 If channel is not empty, immediately dequeues a value from the channel.
385 Otherwise the fiber gets suspended until at least one new item is
386 <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>ed
387 (return value <code class="computeroutput"><span class="identifier">success</span></code>
388 and <code class="computeroutput"><span class="identifier">va</span></code> contains dequeued
389 value), or the channel gets <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>),
390 or the system time reaches the computed timeout time (return value
391 <code class="computeroutput"><span class="identifier">timeout</span></code>).
392 </p></dd>
393<dt><span class="term">Throws:</span></dt>
394<dd><p>
395 timeout-related exceptions.
396 </p></dd>
397</dl>
398</div>
399<p>
400 </p>
401<h5>
402<a name="unbounded_channel_pop_wait_until_bridgehead"></a>
403 <span><a name="unbounded_channel_pop_wait_until"></a></span>
404 <a class="link" href="channels.html#unbounded_channel_pop_wait_until">Member
405 function <code class="computeroutput">pop_wait_until</code>()</a>
406</h5>
407<p>
408 </p>
409<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
410<span class="identifier">channel_op_status</span> <span class="identifier">pop_wait_until</span><span class="special">(</span>
411 <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
412 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</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 Accepts a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span>
420 <span class="identifier">Clock</span><span class="special">,</span>
421 <span class="identifier">Duration</span> <span class="special">&gt;</span></code>.
422 If channel is not empty, immediately dequeues a value from the channel.
423 Otherwise the fiber gets suspended until at least one new item is
424 <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>ed
425 (return value <code class="computeroutput"><span class="identifier">success</span></code>
426 and <code class="computeroutput"><span class="identifier">va</span></code> contains dequeued
427 value), or the channel gets <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>),
428 or the system time reaches the passed <code class="computeroutput"><span class="identifier">time_point</span></code>
429 (return value <code class="computeroutput"><span class="identifier">timeout</span></code>).
430 </p></dd>
431<dt><span class="term">Throws:</span></dt>
432<dd><p>
433 timeout-related exceptions.
434 </p></dd>
435</dl>
436</div>
437<p>
438 </p>
439<h5>
440<a name="class_bounded_channel_bridgehead"></a>
441 <span><a name="class_bounded_channel"></a></span>
442 <a class="link" href="channels.html#class_bounded_channel">Template
443 <code class="computeroutput">bounded_channel&lt;&gt;</code></a>
444</h5>
445<p>
446 </p>
447<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">bounded_channel</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
448
449<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
450<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
451
452<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> <span class="special">=</span> <a href="http://en.cppreference.com/w/cpp/memory/allocator" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span></code></a> <span class="special">&gt;</span>
453<span class="keyword">class</span> <span class="identifier">bounded_channel</span> <span class="special">{</span>
454<span class="keyword">public</span><span class="special">:</span>
455 <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span><span class="special">;</span>
456
457 <span class="identifier">bounded_channel</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">wm</span><span class="special">,</span> <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span> <span class="special">=</span> <span class="identifier">Allocator</span><span class="special">()</span> <span class="special">);</span>
458 <span class="identifier">bounded_channel</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">hwm</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">lwm</span><span class="special">,</span> <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span> <span class="special">=</span> <span class="identifier">Allocator</span><span class="special">()</span> <span class="special">);</span>
459
460 <span class="identifier">bounded_channel</span><span class="special">(</span> <span class="identifier">bounded_channel</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
461 <span class="identifier">bounded_channel</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">bounded_channel</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">other</span><span class="special">)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
462
463 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">upper_bound</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
464 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">lower_bound</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
465
466 <span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
467
468 <span class="identifier">channel_op_status</span> <span class="identifier">push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
469 <span class="identifier">channel_op_status</span> <span class="identifier">push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">);</span>
470 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
471 <span class="identifier">channel_op_status</span> <span class="identifier">push_wait_for</span><span class="special">(</span>
472 <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
473 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
474 <span class="identifier">channel_op_status</span> <span class="identifier">push_wait_for</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">,</span>
475 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
476 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
477 <span class="identifier">channel_op_status</span> <span class="identifier">push_wait_until</span><span class="special">(</span>
478 <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
479 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
480 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
481 <span class="identifier">channel_op_status</span> <span class="identifier">push_wait_until</span><span class="special">(</span>
482 <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">,</span>
483 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
484 <span class="identifier">channel_op_status</span> <span class="identifier">try_push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
485 <span class="identifier">channel_op_status</span> <span class="identifier">try_push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">);</span>
486
487 <span class="identifier">channel_op_status</span> <span class="identifier">pop</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
488 <span class="identifier">value_type</span> <span class="identifier">value_pop</span><span class="special">();</span>
489 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
490 <span class="identifier">channel_op_status</span> <span class="identifier">pop_wait_for</span><span class="special">(</span>
491 <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
492 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
493 <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
494 <span class="identifier">channel_op_status</span> <span class="identifier">pop_wait_until</span><span class="special">(</span>
495 <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
496 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
497 <span class="identifier">channel_op_status</span> <span class="identifier">try_pop</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
498<span class="special">};</span>
499
500<span class="special">}}</span>
501</pre>
502<h5>
503<a name="fiber.synchronization.channels.h7"></a>
504 <span><a name="fiber.synchronization.channels.constructor0"></a></span><a class="link" href="channels.html#fiber.synchronization.channels.constructor0">Constructor</a>
505 </h5>
506<pre class="programlisting"><span class="identifier">bounded_channel</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">wm</span><span class="special">,</span> <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span> <span class="special">=</span> <span class="identifier">Allocator</span><span class="special">()</span> <span class="special">);</span>
507<span class="identifier">bounded_channel</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">hwm</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">lwm</span><span class="special">,</span> <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">alloc</span> <span class="special">=</span> <span class="identifier">Allocator</span><span class="special">()</span> <span class="special">);</span>
508</pre>
509<div class="variablelist">
510<p class="title"><b></b></p>
511<dl>
512<dt><span class="term">Preconditions:</span></dt>
513<dd><p>
514 <code class="computeroutput"><span class="identifier">hwm</span> <span class="special">&gt;</span>
515 <span class="identifier">lwm</span></code>
516 </p></dd>
517<dt><span class="term">Effects:</span></dt>
518<dd><p>
519 Constructs an object of class <code class="computeroutput"><span class="identifier">bounded_channel</span></code>.
520 The constructor with two arguments constructs an object of class <code class="computeroutput"><span class="identifier">bounded_channel</span></code> with a high-watermark
521 of <code class="computeroutput"><span class="identifier">hwm</span></code> and a low-watermark
522 of <code class="computeroutput"><span class="identifier">lwm</span></code> items. The constructor
523 with one <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span></code> argument is effectively the
524 same as <code class="computeroutput"><span class="identifier">bounded_channel</span><span class="special">(</span><span class="identifier">wm</span><span class="special">,</span> <span class="special">(</span><span class="identifier">wm</span><span class="special">-</span><span class="number">1</span><span class="special">),</span> <span class="identifier">alloc</span><span class="special">)</span></code>.
525 Internal nodes are allocated using <code class="computeroutput"><span class="identifier">alloc</span></code>
526 - C++11-allocators are supported.
527 </p></dd>
528<dt><span class="term">Throws:</span></dt>
529<dd><p>
530 <code class="computeroutput"><span class="identifier">fiber_error</span></code>
531 </p></dd>
532<dt><span class="term">Error Conditions:</span></dt>
533<dd><p>
534 <span class="bold"><strong>invalid_argument</strong></span>: if <code class="computeroutput"><span class="identifier">lwm</span> <span class="special">&gt;=</span>
535 <span class="identifier">hwm</span></code>.
536 </p></dd>
537<dt><span class="term">Notes:</span></dt>
538<dd><p>
539 Once the number of values in the channel reaches <code class="computeroutput"><span class="identifier">hwm</span></code>,
540 any call to <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>,
541 <code class="computeroutput"><span class="identifier">push_wait_for</span><span class="special">()</span></code>
542 or <code class="computeroutput"><span class="identifier">push_wait_until</span><span class="special">()</span></code> will block until the number of values
543 in the channel is at most <code class="computeroutput"><span class="identifier">lwm</span></code>.
544 That is, if <code class="computeroutput"><span class="identifier">lwm</span> <span class="special">&lt;</span>
545 <span class="special">(</span><span class="identifier">hwm</span><span class="special">-</span><span class="number">1</span><span class="special">)</span></code>,
546 the channel can be in a state in which <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">push_wait_for</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">push_wait_until</span><span class="special">()</span></code> calls will block (channel is full)
547 even though the number of values in the channel is less than <code class="computeroutput"><span class="identifier">hwm</span></code>.
548 </p></dd>
549<dt><span class="term">See also:</span></dt>
550<dd><p>
551 <a href="http://en.cppreference.com/w/cpp/concept/Allocator" target="_top"><code class="computeroutput"><span class="identifier">Allocator</span></code></a> concept, <a href="http://en.cppreference.com/w/cpp/memory/allocator" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special">&lt;</span>
552 <span class="identifier">T</span> <span class="special">&gt;</span></code></a>
553 </p></dd>
554</dl>
555</div>
556<p>
557 </p>
558<h5>
559<a name="bounded_channel_upper_bound_bridgehead"></a>
560 <span><a name="bounded_channel_upper_bound"></a></span>
561 <a class="link" href="channels.html#bounded_channel_upper_bound">Member
562 function <code class="computeroutput">upper_bound</code>()</a>
563</h5>
564<p>
565 </p>
566<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">upper_bound</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
567</pre>
568<div class="variablelist">
569<p class="title"><b></b></p>
570<dl>
571<dt><span class="term">Returns:</span></dt>
572<dd><p>
573 the high-watermark with which <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was constructed.
574 </p></dd>
575<dt><span class="term">Throws:</span></dt>
576<dd><p>
577 Nothing.
578 </p></dd>
579</dl>
580</div>
581<p>
582 </p>
583<h5>
584<a name="bounded_channel_lower_bound_bridgehead"></a>
585 <span><a name="bounded_channel_lower_bound"></a></span>
586 <a class="link" href="channels.html#bounded_channel_lower_bound">Member
587 function <code class="computeroutput">lower_bound</code>()</a>
588</h5>
589<p>
590 </p>
591<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">lower_bound</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
592</pre>
593<div class="variablelist">
594<p class="title"><b></b></p>
595<dl>
596<dt><span class="term">Returns:</span></dt>
597<dd><p>
598 the low-watermark with which <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> was constructed.
599 </p></dd>
600<dt><span class="term">Throws:</span></dt>
601<dd><p>
602 Nothing.
603 </p></dd>
604</dl>
605</div>
606<p>
607 </p>
608<h5>
609<a name="bounded_channel_close_bridgehead"></a>
610 <span><a name="bounded_channel_close"></a></span>
611 <a class="link" href="channels.html#bounded_channel_close">Member
612 function <code class="computeroutput">close</code>()</a>
613</h5>
614<p>
615 </p>
616<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">close</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
617</pre>
618<div class="variablelist">
619<p class="title"><b></b></p>
620<dl>
621<dt><span class="term">Effects:</span></dt>
622<dd><p>
623 Deactivates the channel. No values can be put after calling <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">close</span><span class="special">()</span></code>.
624 Fibers blocked in <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_for</span><span class="special">()</span></code> or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_until</span><span class="special">()</span></code> will return <code class="computeroutput"><span class="identifier">closed</span></code>.
625 Fibers blocked in <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">value_pop</span><span class="special">()</span></code> will receive an exception.
626 </p></dd>
627<dt><span class="term">Throws:</span></dt>
628<dd><p>
629 Nothing.
630 </p></dd>
631<dt><span class="term">Note:</span></dt>
632<dd><p>
633 <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>
634 is like closing a pipe. It informs waiting consumers that no more values
635 will arrive.
636 </p></dd>
637</dl>
638</div>
639<p>
640 </p>
641<h5>
642<a name="bounded_channel_push_bridgehead"></a>
643 <span><a name="bounded_channel_push"></a></span>
644 <a class="link" href="channels.html#bounded_channel_push">Member
645 function <code class="computeroutput">push</code>()</a>
646</h5>
647<p>
648 </p>
649<pre class="programlisting"><span class="identifier">channel_op_status</span> <span class="identifier">push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
650<span class="identifier">channel_op_status</span> <span class="identifier">push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">);</span>
651</pre>
652<div class="variablelist">
653<p class="title"><b></b></p>
654<dl>
655<dt><span class="term">Effects:</span></dt>
656<dd><p>
657 If channel is closed, returns <code class="computeroutput"><span class="identifier">closed</span></code>.
658 If channel is not full, enqueues the value in the channel, wakes up
659 a fiber blocked on <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">value_pop</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_for</span><span class="special">()</span></code> or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_until</span><span class="special">()</span></code> and returns <code class="computeroutput"><span class="identifier">success</span></code>.
660 Otherwise the calling fiber is suspended until the number of values
661 in the channel drops to <code class="computeroutput"><span class="identifier">lwm</span></code>
662 (return value <code class="computeroutput"><span class="identifier">success</span></code>)or
663 the channel is <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>).
664 </p></dd>
665<dt><span class="term">Throws:</span></dt>
666<dd><p>
667 exceptions thrown by memory allocation and copying or moving <code class="computeroutput"><span class="identifier">va</span></code>.
668 </p></dd>
669</dl>
670</div>
671<p>
672 </p>
673<h5>
674<a name="bounded_channel_push_wait_for_bridgehead"></a>
675 <span><a name="bounded_channel_push_wait_for"></a></span>
676 <a class="link" href="channels.html#bounded_channel_push_wait_for">Member
677 function <code class="computeroutput">push_wait_for</code>()</a>
678</h5>
679<p>
680 </p>
681<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
682<span class="identifier">channel_op_status</span> <span class="identifier">push_wait_for</span><span class="special">(</span>
683 <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
684 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
685
686<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
687<span class="identifier">channel_op_status</span> <span class="identifier">push_wait_for</span><span class="special">(</span>
688 <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">,</span>
689 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">);</span>
690</pre>
691<div class="variablelist">
692<p class="title"><b></b></p>
693<dl>
694<dt><span class="term">Effects:</span></dt>
695<dd><p>
696 Accepts <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code> and internally computes
697 a time_point as (system time + <code class="computeroutput"><span class="identifier">timeout_duration</span></code>).
698 If channel is closed, returns <code class="computeroutput"><span class="identifier">closed</span></code>.
699 If channel is not full, enqueues the value in the channel, wakes up
700 a fiber blocked on <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">value_pop</span><span class="special">()</span></code>, <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_for</span><span class="special">()</span></code> or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_until</span><span class="special">()</span></code> and returns <code class="computeroutput"><span class="identifier">success</span></code>.
701 Otherwise the calling fiber is suspended until the number of values
702 in the channel drops to <code class="computeroutput"><span class="identifier">lwm</span></code>
703 (return value <code class="computeroutput"><span class="identifier">success</span></code>),
704 the channel is <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>),
705 or the system time reaches the computed time_point (return value <code class="computeroutput"><span class="identifier">timeout</span></code>).
706 </p></dd>
707<dt><span class="term">Throws:</span></dt>
708<dd><p>
709 exceptions thrown by memory allocation and copying or moving <code class="computeroutput"><span class="identifier">va</span></code> or timeout-related exceptions.
710 </p></dd>
711</dl>
712</div>
713<p>
714 </p>
715<h5>
716<a name="bounded_channel_push_wait_until_bridgehead"></a>
717 <span><a name="bounded_channel_push_wait_until"></a></span>
718 <a class="link" href="channels.html#bounded_channel_push_wait_until">Member
719 function <code class="computeroutput">push_wait_until</code>()</a>
720</h5>
721<p>
722 </p>
723<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
724<span class="identifier">channel_op_status</span> <span class="identifier">push_wait_until</span><span class="special">(</span>
725 <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
726 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
727
728<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
729<span class="identifier">channel_op_status</span> <span class="identifier">push_wait_until</span><span class="special">(</span>
730 <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">,</span>
731 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">);</span>
732</pre>
733<div class="variablelist">
734<p class="title"><b></b></p>
735<dl>
736<dt><span class="term">Effects:</span></dt>
737<dd><p>
738 Accepts an absolute <code class="computeroutput"><span class="identifier">timeout_time</span></code>
739 in any supported time_point type. If channel is closed, returns <code class="computeroutput"><span class="identifier">closed</span></code>. If channel is not full, enqueues
740 the value in the channel, wakes up a fiber blocked on <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop</span><span class="special">()</span></code>,
741 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">value_pop</span><span class="special">()</span></code>,
742 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_for</span><span class="special">()</span></code>
743 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_until</span><span class="special">()</span></code>
744 and returns <code class="computeroutput"><span class="identifier">success</span></code>.
745 Otherwise the calling fiber is suspended until the number of values
746 in the channel drops to <code class="computeroutput"><span class="identifier">lwm</span></code>
747 (return value <code class="computeroutput"><span class="identifier">success</span></code>),
748 the channel is <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>),
749 or the system time reaches the passed time_point (return value <code class="computeroutput"><span class="identifier">timeout</span></code>).
750 </p></dd>
751<dt><span class="term">Throws:</span></dt>
752<dd><p>
753 exceptions thrown by memory allocation and copying or moving <code class="computeroutput"><span class="identifier">va</span></code> or timeout-related exceptions.
754 </p></dd>
755</dl>
756</div>
757<p>
758 </p>
759<h5>
760<a name="bounded_channel_try_push_bridgehead"></a>
761 <span><a name="bounded_channel_try_push"></a></span>
762 <a class="link" href="channels.html#bounded_channel_try_push">Member
763 function <code class="computeroutput">try_push</code>()</a>
764</h5>
765<p>
766 </p>
767<pre class="programlisting"><span class="identifier">channel_op_status</span> <span class="identifier">try_push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
768<span class="identifier">channel_op_status</span> <span class="identifier">try_push</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;&amp;</span> <span class="identifier">va</span><span class="special">);</span>
769</pre>
770<div class="variablelist">
771<p class="title"><b></b></p>
772<dl>
773<dt><span class="term">Effects:</span></dt>
774<dd><p>
775 If channel is full, returns <code class="computeroutput"><span class="identifier">full</span></code>.
776 If channel is closed, returns <code class="computeroutput"><span class="identifier">closed</span></code>.
777 Otherwise enqueues the value in the channel, wakes up a fiber blocked
778 on <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop</span><span class="special">()</span></code>,
779 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">value_pop</span><span class="special">()</span></code>,
780 <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_for</span><span class="special">()</span></code>
781 or <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">pop_wait_until</span><span class="special">()</span></code>
782 and returns <code class="computeroutput"><span class="identifier">success</span></code>.
783 </p></dd>
784<dt><span class="term">Throws:</span></dt>
785<dd><p>
786 Exceptions thrown by memory allocation and copying or moving <code class="computeroutput"><span class="identifier">va</span></code>.
787 </p></dd>
788</dl>
789</div>
790<p>
791 </p>
792<h5>
793<a name="bounded_channel_pop_bridgehead"></a>
794 <span><a name="bounded_channel_pop"></a></span>
795 <a class="link" href="channels.html#bounded_channel_pop">Member
796 function <code class="computeroutput">pop</code>()</a>
797</h5>
798<p>
799 </p>
800<pre class="programlisting"><span class="identifier">channel_op_status</span> <span class="identifier">pop</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
801</pre>
802<div class="variablelist">
803<p class="title"><b></b></p>
804<dl>
805<dt><span class="term">Effects:</span></dt>
806<dd><p>
807 Dequeues a value from the channel. If the channel is empty, the fiber
808 gets suspended until at least one new item is <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>ed (return value <code class="computeroutput"><span class="identifier">success</span></code>
809 and <code class="computeroutput"><span class="identifier">va</span></code> contains dequeued
810 value) or the channel gets <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>).
811 Once the number of items remaining in the channel drops to <code class="computeroutput"><span class="identifier">lwm</span></code>, any fibers blocked on <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>,
812 <code class="computeroutput"><span class="identifier">push_wait_for</span><span class="special">()</span></code>
813 or <code class="computeroutput"><span class="identifier">push_wait_until</span><span class="special">()</span></code> may resume.
814 </p></dd>
815<dt><span class="term">Throws:</span></dt>
816<dd><p>
817 Nothing
818 </p></dd>
819</dl>
820</div>
821<p>
822 </p>
823<h5>
824<a name="bounded_channel_value_pop_bridgehead"></a>
825 <span><a name="bounded_channel_value_pop"></a></span>
826 <a class="link" href="channels.html#bounded_channel_value_pop">Member
827 function <code class="computeroutput">value_pop</code>()</a>
828</h5>
829<p>
830 </p>
831<pre class="programlisting"><span class="identifier">value_type</span> <span class="identifier">value_pop</span><span class="special">();</span>
832</pre>
833<div class="variablelist">
834<p class="title"><b></b></p>
835<dl>
836<dt><span class="term">Effects:</span></dt>
837<dd><p>
838 Dequeues a value from the channel. If the channel is empty, the fiber
839 gets suspended until at least one new item is <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>ed or the channel gets <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d
840 (which throws an exception). Once the number of items remaining in
841 the channel drops to <code class="computeroutput"><span class="identifier">lwm</span></code>,
842 any fibers blocked on <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">push_wait_for</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">push_wait_until</span><span class="special">()</span></code> may resume.
843 </p></dd>
844<dt><span class="term">Throws:</span></dt>
845<dd><p>
846 <code class="computeroutput"><span class="identifier">fiber_error</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
847 is closed
848 </p></dd>
849<dt><span class="term">Error conditions:</span></dt>
850<dd><p>
851 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">errc</span><span class="special">::</span><span class="identifier">operation_not_permitted</span></code>
852 </p></dd>
853</dl>
854</div>
855<p>
856 </p>
857<h5>
858<a name="bounded_channel_try_pop_bridgehead"></a>
859 <span><a name="bounded_channel_try_pop"></a></span>
860 <a class="link" href="channels.html#bounded_channel_try_pop">Member
861 function <code class="computeroutput">try_pop</code>()</a>
862</h5>
863<p>
864 </p>
865<pre class="programlisting"><span class="identifier">channel_op_status</span> <span class="identifier">try_pop</span><span class="special">(</span> <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">);</span>
866</pre>
867<div class="variablelist">
868<p class="title"><b></b></p>
869<dl>
870<dt><span class="term">Effects:</span></dt>
871<dd><p>
872 If channel is empty, returns <code class="computeroutput"><span class="identifier">empty</span></code>.
873 If channel is closed, returns <code class="computeroutput"><span class="identifier">closed</span></code>.
874 Otherwise it returns <code class="computeroutput"><span class="identifier">success</span></code>
875 and <code class="computeroutput"><span class="identifier">va</span></code> contains the
876 dequeued value. Once the number of items remaining in the channel drops
877 to <code class="computeroutput"><span class="identifier">lwm</span></code>, any fibers
878 blocked on <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>,
879 <code class="computeroutput"><span class="identifier">push_wait_for</span><span class="special">()</span></code>
880 or <code class="computeroutput"><span class="identifier">push_wait_until</span><span class="special">()</span></code> may resume.
881 </p></dd>
882<dt><span class="term">Throws:</span></dt>
883<dd><p>
884 Exceptions thrown by copy- or move-operations.
885 </p></dd>
886</dl>
887</div>
888<p>
889 </p>
890<h5>
891<a name="bounded_channel_pop_wait_for_bridgehead"></a>
892 <span><a name="bounded_channel_pop_wait_for"></a></span>
893 <a class="link" href="channels.html#bounded_channel_pop_wait_for">Member
894 function <code class="computeroutput">pop_wait_for</code>()</a>
895</h5>
896<p>
897 </p>
898<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Period</span> <span class="special">&gt;</span>
899<span class="identifier">channel_op_status</span> <span class="identifier">pop_wait_for</span><span class="special">(</span>
900 <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
901 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span><span class="special">&lt;</span> <span class="identifier">Rep</span><span class="special">,</span> <span class="identifier">Period</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_duration</span><span class="special">)</span>
902</pre>
903<div class="variablelist">
904<p class="title"><b></b></p>
905<dl>
906<dt><span class="term">Effects:</span></dt>
907<dd><p>
908 Accepts <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">duration</span></code> and internally computes
909 a timeout time as (system time + <code class="computeroutput"><span class="identifier">timeout_duration</span></code>).
910 If channel is not empty, immediately dequeues a value from the channel.
911 Otherwise the fiber gets suspended until at least one new item is
912 <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>ed
913 (return value <code class="computeroutput"><span class="identifier">success</span></code>
914 and <code class="computeroutput"><span class="identifier">va</span></code> contains dequeued
915 value), or the channel gets <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>),
916 or the system time reaches the computed timeout time (return value
917 <code class="computeroutput"><span class="identifier">timeout</span></code>). Once the
918 number of items remaining in the channel drops to <code class="computeroutput"><span class="identifier">lwm</span></code>,
919 any fibers blocked on <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>, <code class="computeroutput"><span class="identifier">push_wait_for</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">push_wait_until</span><span class="special">()</span></code> may resume.
920 </p></dd>
921<dt><span class="term">Throws:</span></dt>
922<dd><p>
923 timeout-related exceptions.
924 </p></dd>
925</dl>
926</div>
927<p>
928 </p>
929<h5>
930<a name="bounded_channel_pop_wait_until_bridgehead"></a>
931 <span><a name="bounded_channel_pop_wait_until"></a></span>
932 <a class="link" href="channels.html#bounded_channel_pop_wait_until">Member
933 function <code class="computeroutput">pop_wait_until</code>()</a>
934</h5>
935<p>
936 </p>
937<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Duration</span> <span class="special">&gt;</span>
938<span class="identifier">channel_op_status</span> <span class="identifier">pop_wait_until</span><span class="special">(</span>
939 <span class="identifier">value_type</span> <span class="special">&amp;</span> <span class="identifier">va</span><span class="special">,</span>
940 <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span> <span class="identifier">Clock</span><span class="special">,</span> <span class="identifier">Duration</span> <span class="special">&gt;</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">timeout_time</span><span class="special">)</span>
941</pre>
942<div class="variablelist">
943<p class="title"><b></b></p>
944<dl>
945<dt><span class="term">Effects:</span></dt>
946<dd><p>
947 Accepts a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">time_point</span><span class="special">&lt;</span>
948 <span class="identifier">Clock</span><span class="special">,</span>
949 <span class="identifier">Duration</span> <span class="special">&gt;</span></code>.
950 If channel is not empty, immediately dequeues a value from the channel.
951 Otherwise the fiber gets suspended until at least one new item is
952 <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>ed
953 (return value <code class="computeroutput"><span class="identifier">success</span></code>
954 and <code class="computeroutput"><span class="identifier">va</span></code> contains dequeued
955 value), or the channel gets <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>d (return value <code class="computeroutput"><span class="identifier">closed</span></code>),
956 or the system time reaches the passed <code class="computeroutput"><span class="identifier">time_point</span></code>
957 (return value <code class="computeroutput"><span class="identifier">timeout</span></code>).
958 Once the number of items remaining in the channel drops to <code class="computeroutput"><span class="identifier">lwm</span></code>, any fibers blocked on <code class="computeroutput"><span class="identifier">push</span><span class="special">()</span></code>,
959 <code class="computeroutput"><span class="identifier">push_wait_for</span><span class="special">()</span></code>
960 or <code class="computeroutput"><span class="identifier">push_wait_until</span><span class="special">()</span></code> may resume.
961 </p></dd>
962<dt><span class="term">Throws:</span></dt>
963<dd><p>
964 timeout-related exceptions.
965 </p></dd>
966</dl>
967</div>
968</div>
969<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
970<td align="left"></td>
971<td align="right"><div class="copyright-footer">Copyright &#169; 2013 Oliver Kowalke<p>
972 Distributed under the Boost Software License, Version 1.0. (See accompanying
973 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>)
974 </p>
975</div></td>
976</tr></table>
977<hr>
978<div class="spirit-nav">
979<a accesskey="p" href="barriers.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../synchronization.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="futures.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
980</div>
981</body>
982</html>