1
0
mirror da https://github.com/tearshark/librf.git synced 2024-10-01 15:57:07 +08:00
librf/doxygen/html/channel__v1_8h_source.html
tearshark cd74eea532 完善文档。
上传Doxygen生成的文档。
2020-03-31 15:30:45 +08:00

324 righe
37 KiB
HTML
Originale Blame Cronologia

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>librf: librf/src/channel_v1.h 源文件</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">librf
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'搜索');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_3c80010775d22af2067790ecc9cdcf9d.html">librf</a></li><li class="navelem"><a class="el" href="dir_54ae0e78d997f6903cdf0996223d047f.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">channel_v1.h</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#pragma once</span></div>
<div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160; </div>
<div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="keyword">namespace </span>resumef</div>
<div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;{</div>
<div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160; <span class="keyword">namespace </span>detail</div>
<div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160; {</div>
<div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; <span class="keyword">struct </span>channel_impl : <span class="keyword">public</span> std::enable_shared_from_this&lt;channel_impl&lt;_Ty&gt;&gt;</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; {</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">typedef</span> _awaker&lt;channel_impl&lt;_Ty&gt;, _Ty*, error_code&gt; channel_read_awaker;</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;channel_read_awaker&gt; channel_read_awaker_ptr;</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; </div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="keyword">typedef</span> _awaker&lt;channel_impl&lt;_Ty&gt;&gt; channel_write_awaker;</div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;channel_write_awaker&gt; channel_write_awaker_ptr;</div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="keyword">typedef</span> std::pair&lt;channel_write_awaker_ptr, _Ty&gt; write_tuple_type;</div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="comment">//typedef spinlock lock_type;</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="keyword">typedef</span> std::recursive_mutex lock_type;</div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; </div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; lock_type _lock; <span class="comment">//保证访问本对象是线程安全的</span></div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keyword">const</span> <span class="keywordtype">size_t</span> _max_counter; <span class="comment">//数据队列的容量上限</span></div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; std::deque&lt;_Ty&gt; _values; <span class="comment">//数据队列</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; std::list&lt;channel_read_awaker_ptr&gt; _read_awakes; <span class="comment">//读队列</span></div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; std::list&lt;write_tuple_type&gt; _write_awakes; <span class="comment">//写队列</span></div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; channel_impl(<span class="keywordtype">size_t</span> max_counter_)</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; :_max_counter(max_counter_)</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; {</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; }</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; </div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#if _DEBUG</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; <span class="keyword">const</span> std::deque&lt;_Ty&gt;&amp; debug_queue()<span class="keyword"> const</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="keywordflow">return</span> _values;</div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; }</div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> callee_t, <span class="keyword">class</span> = std::enable_if&lt;!std::is_same&lt;std::remove_cv_t&lt;callee_t&gt;, channel_read_awaker_ptr&gt;::value&gt;&gt;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; decltype(<span class="keyword">auto</span>) read(callee_t&amp;&amp; awaker)</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; {</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; <span class="keywordflow">return</span> read_(std::make_shared&lt;channel_read_awaker&gt;(std::forward&lt;callee_t&gt;(awaker)));</div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; }</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> callee_t, <span class="keyword">class</span> _Ty2, <span class="keyword">class</span> = std::enable_if&lt;!std::is_same&lt;std::remove_cv_t&lt;callee_t&gt;, channel_write_awaker_ptr&gt;::value&gt;&gt;</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; decltype(<span class="keyword">auto</span>) write(callee_t&amp;&amp; awaker, _Ty2&amp;&amp; val)</div>
<div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; {</div>
<div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; <span class="keywordflow">return</span> write_(std::make_shared&lt;channel_write_awaker&gt;(std::forward&lt;callee_t&gt;(awaker)), std::forward&lt;_Ty2&gt;(val));</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; }</div>
<div class="line"><a name="l00048"></a><span class="lineno"> 48</span>&#160; </div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="comment">//如果已经触发了awaker,则返回true</span></div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="comment">//设计目标是线程安全的,实际情况待考察</span></div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordtype">bool</span> read_(channel_read_awaker_ptr&amp;&amp; r_awaker)</div>
<div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; {</div>
<div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; assert(r_awaker);</div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; </div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; scoped_lock&lt;lock_type&gt; lock_(this-&gt;_lock);</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; </div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordtype">bool</span> ret_value;</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">if</span> (_values.size() &gt; 0)</div>
<div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; {</div>
<div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="comment">//如果数据队列有数据,则可以直接读数据</span></div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keyword">auto</span> val = std::move(_values.front());</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; _values.pop_front();</div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; </div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; r_awaker-&gt;awake(<span class="keyword">this</span>, 1, &amp;val, error_code::none);</div>
<div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; ret_value = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; }</div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; {</div>
<div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; <span class="comment">//否则,将“读等待”放入“读队列”</span></div>
<div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; _read_awakes.push_back(r_awaker);</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; ret_value = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; }</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; </div>
<div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="comment">//如果已有写队列,则唤醒一个“写等待”</span></div>
<div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; awake_one_writer_();</div>
<div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; </div>
<div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="keywordflow">return</span> ret_value;</div>
<div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; }</div>
<div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; </div>
<div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <span class="comment">//设计目标是线程安全的,实际情况待考察</span></div>
<div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty2&gt;</div>
<div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordtype">void</span> write_(channel_write_awaker_ptr&amp;&amp; w_awaker, _Ty2&amp;&amp; val)</div>
<div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; {</div>
<div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; assert(w_awaker);</div>
<div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; scoped_lock&lt;lock_type&gt; lock_(this-&gt;_lock);</div>
<div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; </div>
<div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; <span class="comment">//如果满了,则不添加到数据队列,而是将“写等待”和值,放入“写队列”</span></div>
<div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="keywordtype">bool</span> is_full = _values.size() &gt;= _max_counter;</div>
<div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keywordflow">if</span> (is_full)</div>
<div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; _write_awakes.push_back(std::make_pair(std::forward&lt;channel_write_awaker_ptr&gt;(w_awaker), std::forward&lt;_Ty2&gt;(val)));</div>
<div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; <span class="keywordflow">else</span></div>
<div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160; _values.push_back(std::forward&lt;_Ty2&gt;(val));</div>
<div class="line"><a name="l00093"></a><span class="lineno"> 93</span>&#160; </div>
<div class="line"><a name="l00094"></a><span class="lineno"> 94</span>&#160; <span class="comment">//如果已有读队列,则唤醒一个“读等待”</span></div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; awake_one_reader_();</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; </div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <span class="comment">//触发 没有放入“写队列”的“写等待”</span></div>
<div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; <span class="keywordflow">if</span> (!is_full) w_awaker-&gt;awake(<span class="keyword">this</span>, 1);</div>
<div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; }</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; </div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="comment">//只能被write_函数调用内部不再需要加锁</span></div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordtype">void</span> awake_one_reader_()</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; {</div>
<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="comment">//assert(!(_read_awakes.size() &gt;= 0 &amp;&amp; _values.size() == 0));</span></div>
<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; </div>
<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> iter = _read_awakes.begin(); iter != _read_awakes.end(); )</div>
<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; {</div>
<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; <span class="keyword">auto</span> r_awaker = *iter;</div>
<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; iter = _read_awakes.erase(iter);</div>
<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; </div>
<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">if</span> (r_awaker-&gt;awake(<span class="keyword">this</span>, 1, _values.size() ? &amp;_values.front() : <span class="keyword">nullptr</span>, error_code::read_before_write))</div>
<div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; {</div>
<div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">if</span> (_values.size()) _values.pop_front();</div>
<div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; </div>
<div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="comment">//唤醒一个“读等待”后,尝试唤醒一个“写等待”,以处理“数据队列”满后的“写等待”</span></div>
<div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; awake_one_writer_();</div>
<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; }</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; }</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; </div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="comment">//只能被read_函数调用内部不再需要加锁</span></div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <span class="keywordtype">void</span> awake_one_writer_()</div>
<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; {</div>
<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">auto</span> iter = _write_awakes.begin(); iter != _write_awakes.end(); )</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; {</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">auto</span> w_awaker = std::move(*iter);</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; iter = _write_awakes.erase(iter);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; </div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <span class="keywordflow">if</span> (w_awaker.first-&gt;awake(<span class="keyword">this</span>, 1))</div>
<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; {</div>
<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; <span class="comment">//一个“写等待”唤醒后,将“写等待”绑定的值,放入“数据队列”</span></div>
<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; _values.push_back(std::move(w_awaker.second));</div>
<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; }</div>
<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; }</div>
<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; }</div>
<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; </div>
<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; <span class="keywordtype">size_t</span> capacity() const noexcept</div>
<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; {</div>
<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; <span class="keywordflow">return</span> _max_counter;</div>
<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; }</div>
<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; </div>
<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; channel_impl(<span class="keyword">const</span> channel_impl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; channel_impl(channel_impl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; channel_impl&amp; operator = (<span class="keyword">const</span> channel_impl&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; channel_impl&amp; operator = (channel_impl&amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; };</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; } <span class="comment">//namespace detail</span></div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; </div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;<span class="keyword">namespace </span>channel_v1</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;{</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty&gt;</div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keyword">struct </span>channel_t</div>
<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; {</div>
<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="keyword">typedef</span> detail::channel_impl&lt;_Ty&gt; channel_impl_type;</div>
<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> channel_impl_type::channel_read_awaker channel_read_awaker;</div>
<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keyword">typedef</span> <span class="keyword">typename</span> channel_impl_type::channel_write_awaker channel_write_awaker;</div>
<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; </div>
<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keyword">typedef</span> std::shared_ptr&lt;channel_impl_type&gt; channel_impl_ptr;</div>
<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">typedef</span> std::weak_ptr&lt;channel_impl_type&gt; channel_impl_wptr;</div>
<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keyword">typedef</span> std::chrono::system_clock clock_type;</div>
<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; channel_impl_ptr _chan;</div>
<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; channel_t(<span class="keywordtype">size_t</span> max_counter = 0)</div>
<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; :_chan(std::make_shared&lt;channel_impl_type&gt;(max_counter))</div>
<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; {</div>
<div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; </div>
<div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; }</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; </div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty2&gt;</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; future_t&lt;bool&gt; write(_Ty2&amp;&amp; val)<span class="keyword"> const</span></div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; awaitable_t&lt;bool&gt; awaitable;</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; </div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keyword">auto</span> awaker = std::make_shared&lt;channel_write_awaker&gt;(</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; [st = awaitable._state](channel_impl_type* chan) -&gt; <span class="keywordtype">bool</span></div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; {</div>
<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; st-&gt;set_value(chan ? true : false);</div>
<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; return true;</div>
<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; });</div>
<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; _chan-&gt;write_(std::move(awaker), std::forward&lt;_Ty2&gt;(val));</div>
<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; </div>
<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">return</span> awaitable.get_future();</div>
<div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; }</div>
<div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; </div>
<div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; future_t&lt;_Ty&gt; read()<span class="keyword"> const</span></div>
<div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; awaitable_t&lt;_Ty&gt; awaitable;</div>
<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; </div>
<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="keyword">auto</span> awaker = std::make_shared&lt;channel_read_awaker&gt;(</div>
<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; [st = awaitable._state](channel_impl_type*, _Ty* val, error_code fe) -&gt; <span class="keywordtype">bool</span></div>
<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; {</div>
<div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; if (val)</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; st-&gt;set_value(std::move(*val));</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; else</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; st-&gt;throw_exception(channel_exception{ fe });</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; </div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; });</div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; _chan-&gt;read_(std::move(awaker));</div>
<div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; </div>
<div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordflow">return</span> awaitable.get_future();</div>
<div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; }</div>
<div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; </div>
<div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class</span> _Ty2&gt;</div>
<div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; future_t&lt;bool&gt; operator &lt;&lt; (_Ty2&amp;&amp; val)<span class="keyword"> const</span></div>
<div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; <span class="keywordflow">return</span> std::move(write(std::forward&lt;_Ty2&gt;(val)));</div>
<div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; }</div>
<div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; </div>
<div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; future_t&lt;_Ty&gt; <span class="keyword">operator</span> co_await ()<span class="keyword"> const</span></div>
<div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordflow">return</span> read();</div>
<div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; }</div>
<div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; </div>
<div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160;<span class="preprocessor">#if _DEBUG</span></div>
<div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="comment">//非线程安全,返回的队列也不是线程安全的</span></div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keyword">const</span> <span class="keyword">auto</span>&amp; debug_queue()<span class="keyword"> const</span></div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;<span class="keyword"> </span>{</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">return</span> _chan-&gt;debug_queue();</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; }</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160;<span class="preprocessor">#endif</span></div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; </div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordtype">size_t</span> capacity() const noexcept</div>
<div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; {</div>
<div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">return</span> _chan-&gt;capacity();</div>
<div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; }</div>
<div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; </div>
<div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; channel_t(<span class="keyword">const</span> channel_t&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; channel_t(channel_t&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; channel_t&amp; operator = (<span class="keyword">const</span> channel_t&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; channel_t&amp; operator = (channel_t&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; };</div>
<div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; </div>
<div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; </div>
<div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keyword">using</span> semaphore_t = channel_t&lt;bool&gt;;</div>
<div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; </div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160;} <span class="comment">//namespace v1</span></div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;} <span class="comment">//namespace resumef</span></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
制作者 &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
</body>
</html>