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

145 lines
12 KiB
HTML
Raw Blame History

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/_awaker.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">_awaker.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="preprocessor">#ifndef DOXYGEN_SKIP_PROPERTY</span></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>resumef</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">namespace </span>detail</div>
<div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160; {</div>
<div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">class </span>_Ety, <span class="keyword">class</span>... _Types&gt;</div>
<div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160; <span class="keyword">struct </span>_awaker</div>
<div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160; {</div>
<div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160; <span class="comment">//如果超时</span></div>
<div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160; <span class="comment">// e 始终为nullptr</span></div>
<div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160; <span class="comment">// 不关心返回值</span></div>
<div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160; <span class="comment">//如果不是超时,</span></div>
<div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160; <span class="comment">// e 指向当前触发的事件用于实现wait_any</span></div>
<div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160; <span class="comment">// 返回true表示成功触发了事件event内部减小一次事件计数并删除此awaker</span></div>
<div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160; <span class="comment">// 返回false表示此事件已经无效event内部只删除此awaker</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160; <span class="keyword">typedef</span> std::function&lt;bool(_Ety * e, _Types...)&gt; callee_type;</div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160; <span class="keyword">typedef</span> spinlock lock_type;</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; <span class="comment">//typedef std::recursive_mutex lock_type;</span></div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160; </div>
<div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160; lock_type _lock;</div>
<div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; callee_type _callee;</div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160; std::atomic&lt;intptr_t&gt; _counter;</div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; <span class="keyword">public</span>:</div>
<div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160; _awaker(callee_type &amp;&amp; callee_, intptr_t init_count_ = 0)</div>
<div class="line"><a name="l00029"></a><span class="lineno"> 29</span>&#160; : _callee(std::forward&lt;callee_type&gt;(callee_))</div>
<div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; , _counter(init_count_)</div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; {</div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; }</div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; </div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="comment">//调用一次后_callee就被置nullptr下次再调用必然返回false</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; <span class="comment">//第一次调用返回调用_callee的返回值</span></div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160; <span class="comment">//超时通过传入nullptr来调用</span></div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; <span class="keywordtype">bool</span> awake(_Ety * e, intptr_t count_, <span class="keyword">const</span> _Types&amp;... args)</div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160; {</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160; assert(count_ &gt; 0);</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; scoped_lock&lt;lock_type&gt; lock_(this-&gt;_lock);</div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; </div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <span class="keywordflow">if</span> ((this-&gt;_counter.fetch_sub(count_) - count_) &lt;= 0)</div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; {</div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; <span class="keywordflow">if</span> (this-&gt;_callee)</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; callee_type callee_ = std::move(this-&gt;_callee);</div>
<div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <span class="keywordflow">return</span> callee_(e, args...);</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="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; }</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</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; </div>
<div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keyword">private</span>:</div>
<div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; _awaker(<span class="keyword">const</span> _awaker &amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; _awaker(_awaker &amp;&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; _awaker &amp; operator = (<span class="keyword">const</span> _awaker &amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; _awaker &amp; operator = (_awaker &amp;&amp;) = <span class="keyword">delete</span>;</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; }</div>
<div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160;}</div>
<div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; </div>
<div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;<span class="preprocessor">#endif //DOXYGEN_SKIP_PROPERTY</span></div>
<div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160;<span class="preprocessor"> </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>