uvw/loop_8hpp_source.html
2017-11-28 14:15:45 +01:00

101 lines
40 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" "http://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.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>uvw: src/uvw/loop.hpp Source File</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">uvw
&#160;<span id="projectnumber">1.4.0</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</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_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_98934c98f70735fe3a272005a9eb8736.html">uvw</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">loop.hpp</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;</div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="preprocessor">#ifdef _WIN32</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="preprocessor">#include &lt;ciso646&gt;</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#include &lt;functional&gt;</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &lt;memory&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &lt;utility&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &lt;type_traits&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &lt;chrono&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &lt;uv.h&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;emitter.hpp&quot;</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#include &quot;util.hpp&quot;</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceuvw.html">uvw</a> {</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;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">namespace </span>details {</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;</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;<span class="keyword">enum class</span> UVLoopOption: std::underlying_type_t&lt;uv_loop_option&gt; {</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160; BLOCK_SIGNAL = UV_LOOP_BLOCK_SIGNAL</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;};</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;</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;<span class="keyword">enum class</span> UVRunMode: std::underlying_type_t&lt;uv_run_mode&gt; {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; DEFAULT = UV_RUN_DEFAULT,</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160; ONCE = UV_RUN_ONCE,</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160; NOWAIT = UV_RUN_NOWAIT</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;</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;}</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;</div><div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="structuvw_1_1BaseHandle.html"> 47</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structuvw_1_1BaseHandle.html">BaseHandle</a> {</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keyword">virtual</span> <a class="code" href="namespaceuvw.html#aa3ae4a038de60a69b2513a039add1e48">HandleCategory</a> category() <span class="keyword">const</span> noexcept = 0;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; <span class="keyword">virtual</span> HandleType type() <span class="keyword">const</span> noexcept = 0;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160;</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> active() <span class="keyword">const</span> noexcept = 0;</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> closing() <span class="keyword">const</span> noexcept = 0;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> reference() noexcept = 0;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> unreference() noexcept = 0;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">bool</span> referenced() <span class="keyword">const</span> noexcept = 0;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="keyword">virtual</span> <span class="keywordtype">void</span> close() noexcept = 0;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160;};</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;</div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html"> 142</a></span>&#160;<span class="keyword">class </span><a class="code" href="classuvw_1_1Loop.html">Loop</a> final: <span class="keyword">public</span> <a class="code" href="classuvw_1_1Emitter.html">Emitter</a>&lt;Loop&gt;, <span class="keyword">public</span> std::enable_shared_from_this&lt;Loop&gt; {</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; <span class="keyword">using</span> Deleter = void(*)(uv_loop_t *);</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; <span class="keyword">template</span>&lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>&gt;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classuvw_1_1Resource.html">Resource</a>;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <a class="code" href="classuvw_1_1Loop.html">Loop</a>(std::unique_ptr&lt;uv_loop_t, Deleter&gt; ptr) noexcept</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; : loop{std::move(ptr)}</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; {}</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">public</span>:</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keyword">using</span> Time = std::chrono::duration&lt;uint64_t, std::milli&gt;;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <span class="keyword">using</span> Configure = details::UVLoopOption;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="keyword">using</span> Mode = details::UVRunMode;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00161"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#ae2a1f36aafb919444d933e4a43e78d8f"> 161</a></span>&#160; <span class="keyword">static</span> std::shared_ptr&lt;Loop&gt; <a class="code" href="classuvw_1_1Loop.html#ae2a1f36aafb919444d933e4a43e78d8f">create</a>() {</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keyword">auto</span> ptr = std::unique_ptr&lt;uv_loop_t, Deleter&gt;{<span class="keyword">new</span> uv_loop_t, [](uv_loop_t *l){ <span class="keyword">delete</span> l; }};</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">auto</span> loop = std::shared_ptr&lt;Loop&gt;{<span class="keyword">new</span> <a class="code" href="classuvw_1_1Loop.html">Loop</a>{std::move(ptr)}};</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; <span class="keywordflow">if</span>(uv_loop_init(loop-&gt;loop.get())) {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; loop = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; }</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160;</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; <span class="keywordflow">return</span> loop;</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="l00184"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#a284450b3ef37c62bd7a984c73552d7b8"> 184</a></span>&#160; <span class="keyword">static</span> std::shared_ptr&lt;Loop&gt; <a class="code" href="classuvw_1_1Loop.html#a284450b3ef37c62bd7a984c73552d7b8">getDefault</a>() {</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keyword">static</span> std::weak_ptr&lt;Loop&gt; ref;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; std::shared_ptr&lt;Loop&gt; loop;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <span class="keywordflow">if</span>(ref.expired()) {</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; <span class="keyword">auto</span> def = uv_default_loop();</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; <span class="keywordflow">if</span>(def) {</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="keyword">auto</span> ptr = std::unique_ptr&lt;uv_loop_t, Deleter&gt;(def, [](uv_loop_t *){});</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; loop = std::shared_ptr&lt;Loop&gt;{<span class="keyword">new</span> <a class="code" href="classuvw_1_1Loop.html">Loop</a>{std::move(ptr)}};</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; }</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; ref = loop;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; loop = ref.lock();</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; }</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keywordflow">return</span> loop;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; }</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; <a class="code" href="classuvw_1_1Loop.html">Loop</a>(<span class="keyword">const</span> <a class="code" href="classuvw_1_1Loop.html">Loop</a> &amp;) = <span class="keyword">delete</span>;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; <a class="code" href="classuvw_1_1Loop.html">Loop</a>(<a class="code" href="classuvw_1_1Loop.html">Loop</a> &amp;&amp;other) = <span class="keyword">delete</span>;</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <a class="code" href="classuvw_1_1Loop.html">Loop</a> &amp; operator=(<span class="keyword">const</span> <a class="code" href="classuvw_1_1Loop.html">Loop</a> &amp;) = <span class="keyword">delete</span>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; <a class="code" href="classuvw_1_1Loop.html">Loop</a> &amp; operator=(<a class="code" href="classuvw_1_1Loop.html">Loop</a> &amp;&amp;other) = <span class="keyword">delete</span>;</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; ~<a class="code" href="classuvw_1_1Loop.html">Loop</a>() noexcept {</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keywordflow">if</span>(loop) {</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; close();</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; }</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="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Args&gt;</div><div class="line"><a name="l00232"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#ad0fac96934f7ea2a19d16bc6502aeec9"> 232</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classuvw_1_1Loop.html#ad0fac96934f7ea2a19d16bc6502aeec9">configure</a>(Configure flag, Args&amp;&amp;... args) {</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keyword">auto</span> option = <span class="keyword">static_cast&lt;</span>std::underlying_type_t&lt;Configure&gt;<span class="keyword">&gt;</span>(flag);</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keyword">auto</span> err = uv_loop_configure(loop.get(), <span class="keyword">static_cast&lt;</span>uv_loop_option<span class="keyword">&gt;</span>(option), std::forward&lt;Args&gt;(args)...);</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; <span class="keywordflow">if</span>(err) { publish(<a class="code" href="structuvw_1_1ErrorEvent.html">ErrorEvent</a>{err}); }</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; }</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span> R, <span class="keyword">typename</span>... Args&gt;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; std::enable_if_t&lt;std::is_base_of&lt;BaseHandle, R&gt;::value, std::shared_ptr&lt;R&gt;&gt;</div><div class="line"><a name="l00250"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#a3898884e2019aa052235377dcd03c0f3"> 250</a></span>&#160; <a class="code" href="classuvw_1_1Loop.html#a3898884e2019aa052235377dcd03c0f3">resource</a>(Args&amp;&amp;... args) {</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keyword">auto</span> ptr = R::create(shared_from_this(), std::forward&lt;Args&gt;(args)...);</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; ptr = ptr-&gt;init() ? ptr : <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">return</span> ptr;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; }</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keyword">template</span>&lt;<span class="keyword">typename</span> R, <span class="keyword">typename</span>... Args&gt;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; std::enable_if_t&lt;not std::is_base_of&lt;BaseHandle, R&gt;::value, std::shared_ptr&lt;R&gt;&gt;</div><div class="line"><a name="l00268"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#a6c6796643be1a5bdfad719591b0f1a55"> 268</a></span>&#160; <a class="code" href="classuvw_1_1Loop.html#a6c6796643be1a5bdfad719591b0f1a55">resource</a>(Args&amp;&amp;... args) {</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">return</span> R::create(shared_from_this(), std::forward&lt;Args&gt;(args)...);</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; }</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160;</div><div class="line"><a name="l00280"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#ae0dbd76098075f5a187256834df568c3"> 280</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classuvw_1_1Loop.html#ae0dbd76098075f5a187256834df568c3">close</a>() {</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keyword">auto</span> err = uv_loop_close(loop.get());</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; <span class="keywordflow">if</span>(err) { publish(<a class="code" href="structuvw_1_1ErrorEvent.html">ErrorEvent</a>{err}); }</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; }</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keyword">template</span>&lt;Mode mode = Mode::DEFAULT&gt;</div><div class="line"><a name="l00304"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#aa86d06ae9f91d8b48d1d5358040f2547"> 304</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classuvw_1_1Loop.html#aa86d06ae9f91d8b48d1d5358040f2547">run</a>() noexcept {</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; <span class="keyword">auto</span> utm = <span class="keyword">static_cast&lt;</span>std::underlying_type_t&lt;Mode&gt;<span class="keyword">&gt;</span>(mode);</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; <span class="keyword">auto</span> uvrm = <span class="keyword">static_cast&lt;</span>uv_run_mode<span class="keyword">&gt;</span>(utm);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160; <span class="keywordflow">return</span> (uv_run(loop.get(), uvrm) == 0);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; }</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;</div><div class="line"><a name="l00314"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#adf73136457c892dad414342c8648e6c1"> 314</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="classuvw_1_1Loop.html#adf73136457c892dad414342c8648e6c1">alive</a>() const noexcept {</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keywordflow">return</span> !(uv_loop_alive(loop.get()) == 0);</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; }</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;</div><div class="line"><a name="l00326"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#a8e9ff32011351d8cf99b0b3924a670df"> 326</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classuvw_1_1Loop.html#a8e9ff32011351d8cf99b0b3924a670df">stop</a>() noexcept {</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; uv_stop(loop.get());</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; }</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;</div><div class="line"><a name="l00339"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#ac78ffc161590ea88902c867ef716d0a2"> 339</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="classuvw_1_1Loop.html#ac78ffc161590ea88902c867ef716d0a2">descriptor</a>() const noexcept {</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordflow">return</span> uv_backend_fd(loop.get());</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; }</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;</div><div class="line"><a name="l00349"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#aa815a8db94b2beb2d23448fe81cf648c"> 349</a></span>&#160; std::pair&lt;bool, Time&gt; <a class="code" href="classuvw_1_1Loop.html#aa815a8db94b2beb2d23448fe81cf648c">timeout</a>() const noexcept {</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <span class="keyword">auto</span> to = uv_backend_timeout(loop.get());</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <span class="keywordflow">return</span> std::make_pair(to == -1, Time{to});</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; }</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160;</div><div class="line"><a name="l00366"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#abb1a1000e23e7d1e849a21fd79b86be9"> 366</a></span>&#160; Time <a class="code" href="classuvw_1_1Loop.html#abb1a1000e23e7d1e849a21fd79b86be9">now</a>() const noexcept {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <span class="keywordflow">return</span> Time{uv_now(loop.get())};</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; }</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;</div><div class="line"><a name="l00379"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#a080af72a50c18b92bb50e89afa116e57"> 379</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classuvw_1_1Loop.html#a080af72a50c18b92bb50e89afa116e57">update</a>() const noexcept {</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; <span class="keywordflow">return</span> uv_update_time(loop.get());</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; }</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#a699f41c1c1d31a65c5d12adacdbb94e1"> 390</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classuvw_1_1Loop.html#a699f41c1c1d31a65c5d12adacdbb94e1">walk</a>(std::function&lt;<span class="keywordtype">void</span>(<a class="code" href="structuvw_1_1BaseHandle.html">BaseHandle</a> &amp;)&gt; callback) {</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="comment">// remember: non-capturing lambdas decay to pointers to functions</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; uv_walk(loop.get(), [](uv_handle_t *handle, <span class="keywordtype">void</span> *func) {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <a class="code" href="structuvw_1_1BaseHandle.html">BaseHandle</a> &amp;ref = *<span class="keyword">static_cast&lt;</span><a class="code" href="structuvw_1_1BaseHandle.html">BaseHandle</a>*<span class="keyword">&gt;</span>(handle-&gt;data);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; std::function&lt;void(BaseHandle &amp;)&gt; &amp;f =</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; *<span class="keyword">static_cast&lt;</span>std::function&lt;void(BaseHandle &amp;)&gt;*<span class="keyword">&gt;</span>(func);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; f(ref);</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; }, &amp;callback);</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; }</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160;</div><div class="line"><a name="l00430"></a><span class="lineno"><a class="line" href="classuvw_1_1Loop.html#a23471c5025efc9db3cc42f6950f952b1"> 430</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classuvw_1_1Loop.html#a23471c5025efc9db3cc42f6950f952b1">fork</a>() noexcept {</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; <span class="keyword">auto</span> err = uv_loop_fork(loop.get());</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <span class="keywordflow">if</span>(err) { publish(<a class="code" href="structuvw_1_1ErrorEvent.html">ErrorEvent</a>{err}); }</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160;</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; std::unique_ptr&lt;uv_loop_t, Deleter&gt; loop;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160;};</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160;}</div><div class="ttc" id="classuvw_1_1Loop_html_a3898884e2019aa052235377dcd03c0f3"><div class="ttname"><a href="classuvw_1_1Loop.html#a3898884e2019aa052235377dcd03c0f3">uvw::Loop::resource</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_base_of&lt; BaseHandle, R &gt;::value, std::shared_ptr&lt; R &gt; &gt; resource(Args &amp;&amp;... args)</div><div class="ttdoc">Creates resources of handles&amp;#39; types. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00250">loop.hpp:250</a></div></div>
<div class="ttc" id="classuvw_1_1Emitter_html"><div class="ttname"><a href="classuvw_1_1Emitter.html">uvw::Emitter</a></div><div class="ttdoc">Event emitter base class. </div><div class="ttdef"><b>Definition:</b> <a href="emitter_8hpp_source.html#l00087">emitter.hpp:87</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_a6c6796643be1a5bdfad719591b0f1a55"><div class="ttname"><a href="classuvw_1_1Loop.html#a6c6796643be1a5bdfad719591b0f1a55">uvw::Loop::resource</a></div><div class="ttdeci">std::enable_if_t&lt; not std::is_base_of&lt; BaseHandle, R &gt;::value, std::shared_ptr&lt; R &gt; &gt; resource(Args &amp;&amp;... args)</div><div class="ttdoc">Creates resources of types other than handles&amp;#39; ones. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00268">loop.hpp:268</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_ac78ffc161590ea88902c867ef716d0a2"><div class="ttname"><a href="classuvw_1_1Loop.html#ac78ffc161590ea88902c867ef716d0a2">uvw::Loop::descriptor</a></div><div class="ttdeci">int descriptor() const noexcept</div><div class="ttdoc">Get backend file descriptor. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00339">loop.hpp:339</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_a23471c5025efc9db3cc42f6950f952b1"><div class="ttname"><a href="classuvw_1_1Loop.html#a23471c5025efc9db3cc42f6950f952b1">uvw::Loop::fork</a></div><div class="ttdeci">void fork() noexcept</div><div class="ttdoc">Reinitialize any kernel state necessary in the child process after a fork(2) system call...</div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00430">loop.hpp:430</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_a080af72a50c18b92bb50e89afa116e57"><div class="ttname"><a href="classuvw_1_1Loop.html#a080af72a50c18b92bb50e89afa116e57">uvw::Loop::update</a></div><div class="ttdeci">void update() const noexcept</div><div class="ttdoc">Updates the event loops concept of now. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00379">loop.hpp:379</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_abb1a1000e23e7d1e849a21fd79b86be9"><div class="ttname"><a href="classuvw_1_1Loop.html#abb1a1000e23e7d1e849a21fd79b86be9">uvw::Loop::now</a></div><div class="ttdeci">Time now() const noexcept</div><div class="ttdoc">Returns the current timestamp in milliseconds. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00366">loop.hpp:366</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_aa86d06ae9f91d8b48d1d5358040f2547"><div class="ttname"><a href="classuvw_1_1Loop.html#aa86d06ae9f91d8b48d1d5358040f2547">uvw::Loop::run</a></div><div class="ttdeci">bool run() noexcept</div><div class="ttdoc">Runs the event loop. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00304">loop.hpp:304</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_a284450b3ef37c62bd7a984c73552d7b8"><div class="ttname"><a href="classuvw_1_1Loop.html#a284450b3ef37c62bd7a984c73552d7b8">uvw::Loop::getDefault</a></div><div class="ttdeci">static std::shared_ptr&lt; Loop &gt; getDefault()</div><div class="ttdoc">Gets the initialized default loop. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00184">loop.hpp:184</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_aa815a8db94b2beb2d23448fe81cf648c"><div class="ttname"><a href="classuvw_1_1Loop.html#aa815a8db94b2beb2d23448fe81cf648c">uvw::Loop::timeout</a></div><div class="ttdeci">std::pair&lt; bool, Time &gt; timeout() const noexcept</div><div class="ttdoc">Gets the poll timeout. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00349">loop.hpp:349</a></div></div>
<div class="ttc" id="namespaceuvw_html_aa3ae4a038de60a69b2513a039add1e48"><div class="ttname"><a href="namespaceuvw.html#aa3ae4a038de60a69b2513a039add1e48">uvw::HandleCategory</a></div><div class="ttdeci">details::UVTypeWrapper&lt; uv_handle_type &gt; HandleCategory</div><div class="ttdef"><b>Definition:</b> <a href="util_8hpp_source.html#l00197">util.hpp:197</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_ad0fac96934f7ea2a19d16bc6502aeec9"><div class="ttname"><a href="classuvw_1_1Loop.html#ad0fac96934f7ea2a19d16bc6502aeec9">uvw::Loop::configure</a></div><div class="ttdeci">void configure(Configure flag, Args &amp;&amp;... args)</div><div class="ttdoc">Sets additional loop options. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00232">loop.hpp:232</a></div></div>
<div class="ttc" id="structuvw_1_1ErrorEvent_html"><div class="ttname"><a href="structuvw_1_1ErrorEvent.html">uvw::ErrorEvent</a></div><div class="ttdoc">The ErrorEvent event. </div><div class="ttdef"><b>Definition:</b> <a href="emitter_8hpp_source.html#l00023">emitter.hpp:23</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html"><div class="ttname"><a href="classuvw_1_1Loop.html">uvw::Loop</a></div><div class="ttdoc">The Loop class. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00142">loop.hpp:142</a></div></div>
<div class="ttc" id="classuvw_1_1Resource_html"><div class="ttname"><a href="classuvw_1_1Resource.html">uvw::Resource</a></div><div class="ttdoc">Common class for almost all the resources available in uvw. </div><div class="ttdef"><b>Definition:</b> <a href="resource_8hpp_source.html#l00019">resource.hpp:19</a></div></div>
<div class="ttc" id="structuvw_1_1BaseHandle_html"><div class="ttname"><a href="structuvw_1_1BaseHandle.html">uvw::BaseHandle</a></div><div class="ttdoc">Untyped handle class. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00047">loop.hpp:47</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_adf73136457c892dad414342c8648e6c1"><div class="ttname"><a href="classuvw_1_1Loop.html#adf73136457c892dad414342c8648e6c1">uvw::Loop::alive</a></div><div class="ttdeci">bool alive() const noexcept</div><div class="ttdoc">Checks if there are active resources. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00314">loop.hpp:314</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_a8e9ff32011351d8cf99b0b3924a670df"><div class="ttname"><a href="classuvw_1_1Loop.html#a8e9ff32011351d8cf99b0b3924a670df">uvw::Loop::stop</a></div><div class="ttdeci">void stop() noexcept</div><div class="ttdoc">Stops the event loop. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00326">loop.hpp:326</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_ae2a1f36aafb919444d933e4a43e78d8f"><div class="ttname"><a href="classuvw_1_1Loop.html#ae2a1f36aafb919444d933e4a43e78d8f">uvw::Loop::create</a></div><div class="ttdeci">static std::shared_ptr&lt; Loop &gt; create()</div><div class="ttdoc">Initializes a new Loop instance. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00161">loop.hpp:161</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_a699f41c1c1d31a65c5d12adacdbb94e1"><div class="ttname"><a href="classuvw_1_1Loop.html#a699f41c1c1d31a65c5d12adacdbb94e1">uvw::Loop::walk</a></div><div class="ttdeci">void walk(std::function&lt; void(BaseHandle &amp;)&gt; callback)</div><div class="ttdoc">Walks the list of handles. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00390">loop.hpp:390</a></div></div>
<div class="ttc" id="classuvw_1_1Loop_html_ae0dbd76098075f5a187256834df568c3"><div class="ttname"><a href="classuvw_1_1Loop.html#ae0dbd76098075f5a187256834df568c3">uvw::Loop::close</a></div><div class="ttdeci">void close()</div><div class="ttdoc">Releases all internal loop resources. </div><div class="ttdef"><b>Definition:</b> <a href="loop_8hpp_source.html#l00280">loop.hpp:280</a></div></div>
<div class="ttc" id="namespaceuvw_html"><div class="ttname"><a href="namespaceuvw.html">uvw</a></div><div class="ttdoc">uvw default namespace. </div><div class="ttdef"><b>Definition:</b> <a href="async_8hpp_source.html#l00011">async.hpp:11</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>