coro.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <!-- This file is generated by Nim. -->
  4. <html xmlns="https://www.w3.org/1999/xhtml" xml:lang="en" lang="en" data-theme="auto">
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <title>std/coro</title>
  9. <!-- Google fonts -->
  10. <link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
  11. <link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
  12. <!-- Favicon -->
  13. <link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
  14. <link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
  15. <!-- CSS -->
  16. <link rel="stylesheet" type="text/css" href="nimdoc.out.css?v=2.3.1">
  17. <!-- JS -->
  18. <script type="text/javascript" src="dochack.js?v=2.3.1"></script>
  19. </head>
  20. <body>
  21. <div class="document" id="documentId">
  22. <div class="container">
  23. <h1 class="title">std/coro</h1>
  24. <div class="row">
  25. <div class="three columns">
  26. <div class="theme-select-wrapper">
  27. <label for="theme-select">Theme:&nbsp;</label>
  28. <select id="theme-select" onchange="setTheme(this.value)">
  29. <option value="auto">🌗 Match OS</option>
  30. <option value="dark">🌑 Dark</option>
  31. <option value="light">🌕 Light</option>
  32. </select>
  33. </div>
  34. <div id="global-links">
  35. <ul class="simple-boot">
  36. <li><a href="manual.html">Manual</a></li>
  37. <li><a href="lib.html">Standard library</a></li>
  38. <li> <a id="indexLink" href="theindex.html">Index</a></li>
  39. <li><a href="compiler/theindex.html">Compiler docs</a></li>
  40. <li><a href="https://nim-lang.github.io/fusion/theindex.html">Fusion docs</a></li>
  41. <li><a href="https://nim-lang.github.io/Nim/">devel</a>, <a href="https://nim-lang.org/documentation.html">stable</a></li>
  42. </ul>
  43. </div>
  44. <div id="searchInputDiv">
  45. Search: <input type="search" id="searchInput"
  46. oninput="search()" />
  47. </div>
  48. <ul class="simple simple-toc" id="toc-list">
  49. <li>
  50. <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
  51. </li>
  52. <li>
  53. <details open>
  54. <summary><a class="reference reference-toplevel" href="#7" id="57">Types</a></summary>
  55. <ul class="simple simple-toc-section">
  56. <li><a class="reference" href="#CoroutineRef" title="CoroutineRef = ref object">CoroutineRef</a></li>
  57. </ul>
  58. </details>
  59. </li>
  60. <li>
  61. <details open>
  62. <summary><a class="reference reference-toplevel" href="#12" id="62">Procs</a></summary>
  63. <ul class="simple simple-toc-section">
  64. <ul class="simple nested-toc-section">alive
  65. <li><a class="reference" href="#alive%2CCoroutineRef" title="alive(c: CoroutineRef): bool">alive(c: CoroutineRef): bool</a></li>
  66. </ul>
  67. <ul class="simple nested-toc-section">nimGC_setStackBottom
  68. <li><a class="reference" href="#nimGC_setStackBottom%2Cpointer" title="nimGC_setStackBottom(theStackBottom: pointer)">nimGC_setStackBottom(theStackBottom: pointer)</a></li>
  69. </ul>
  70. <ul class="simple nested-toc-section">run
  71. <li><a class="reference" href="#run" title="run()">run()</a></li>
  72. </ul>
  73. <ul class="simple nested-toc-section">start
  74. <li><a class="reference" href="#start%2Cproc%29%2Cint" title="start(c: proc (); stacksize: int = defaultStackSize): CoroutineRef">start(c: proc (); stacksize: int = defaultStackSize): CoroutineRef</a></li>
  75. </ul>
  76. <ul class="simple nested-toc-section">suspend
  77. <li><a class="reference" href="#suspend%2Cfloat" title="suspend(sleepTime: float = 0.0)">suspend(sleepTime: float = 0.0)</a></li>
  78. </ul>
  79. <ul class="simple nested-toc-section">wait
  80. <li><a class="reference" href="#wait%2CCoroutineRef%2Cfloat" title="wait(c: CoroutineRef; interval = 0.01)">wait(c: CoroutineRef; interval = 0.01)</a></li>
  81. </ul>
  82. </ul>
  83. </details>
  84. </li>
  85. </ul>
  86. </div>
  87. <div class="nine columns" id="content">
  88. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/pure/coro.nim#L1" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  89. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/pure/coro.nim#L1" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  90. <div id="tocRoot"></div>
  91. <p class="module-desc">Nim coroutines implementation, supports several context switching methods:<table border="1" class="docutils"><tr><td>ucontext</td><td>available on unix and alike (default)</td></tr>
  92. <tr><td>setjmp</td><td>available on unix and alike (x86/64 only)</td></tr>
  93. <tr><td>fibers</td><td>available and required on windows.</td></tr>
  94. </table><div class="option-list"><div class="option-list-item odd"><div class="option-list-label"><tt><span class="option">-d:nimCoroutines</span></tt></div><div class="option-list-description">Required to build this module.</div></div>
  95. <div class="option-list-item"><div class="option-list-label"><tt><span class="option">-d:nimCoroutinesUcontext</span></tt></div><div class="option-list-description">Use ucontext backend.</div></div>
  96. <div class="option-list-item odd"><div class="option-list-label"><tt><span class="option">-d:nimCoroutinesSetjmp</span></tt></div><div class="option-list-description">Use setjmp backend.</div></div>
  97. <div class="option-list-item"><div class="option-list-label"><tt><span class="option">-d:nimCoroutinesSetjmpBundled</span></tt></div><div class="option-list-description">Use bundled setjmp implementation.</div></div>
  98. </div><p>Unstable API.</p>
  99. Timer support for the realtime GC. Based on <a class="reference external" href="https://github.com/jckarter/clay/blob/master/compiler/hirestimer.cpp">https://github.com/jckarter/clay/blob/master/compiler/hirestimer.cpp</a></p>
  100. <div class="section" id="6">
  101. <h1><a class="toc-backref" href="#6">Imports</a></h1>
  102. <dl class="item">
  103. <a class="reference external" href="coro_detection.html">coro_detection</a>, <a class="reference external" href="os.html">os</a>, <a class="reference external" href="lists.html">lists</a>, <a class="reference external" href="assertions.html">assertions</a>
  104. </dl>
  105. </div>
  106. <div class="section" id="7">
  107. <h1><a class="toc-backref" href="#7">Types</a></h1>
  108. <dl class="item">
  109. <div id="CoroutineRef">
  110. <dt><pre><a href="coro.html#CoroutineRef"><span class="Identifier">CoroutineRef</span></a> <span class="Other">=</span> <span class="Keyword">ref</span> <span class="Keyword">object</span></pre></dt>
  111. <dd>
  112. CoroutineRef holds a pointer to actual coroutine object. Public API always returns CoroutineRef instead of CoroutinePtr in order to allow holding a reference to coroutine object while it can be safely deallocated by coroutine scheduler loop. In this case Coroutine.reference.coro is set to nil. Public API checks for it being nil and gracefully fails if it is nil.
  113. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/pure/coro.nim#L166" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  114. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/pure/coro.nim#L166" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  115. </dd>
  116. </div>
  117. </dl>
  118. </div>
  119. <div class="section" id="12">
  120. <h1><a class="toc-backref" href="#12">Procs</a></h1>
  121. <dl class="item">
  122. <div id="alive-procs-all">
  123. <div id="alive,CoroutineRef">
  124. <dt><pre><span class="Keyword">proc</span> <a href="#alive%2CCoroutineRef"><span class="Identifier">alive</span></a><span class="Other">(</span><span class="Identifier">c</span><span class="Other">:</span> <a href="coro.html#CoroutineRef"><span class="Identifier">CoroutineRef</span></a><span class="Other">)</span><span class="Other">:</span> <a href="system.html#bool"><span class="Identifier">bool</span></a> {.<span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  125. <dd>
  126. Returns <tt class="docutils literal"><span class="pre"><span class="Identifier">true</span></span></tt> if coroutine has not returned, <tt class="docutils literal"><span class="pre"><span class="Identifier">false</span></span></tt> otherwise.
  127. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/pure/coro.nim#L339" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  128. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/pure/coro.nim#L339" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  129. </dd>
  130. </div>
  131. </div>
  132. <div id="nimGC_setStackBottom-procs-all">
  133. <div id="nimGC_setStackBottom,pointer">
  134. <dt><pre><span class="Keyword">proc</span> <a href="#nimGC_setStackBottom%2Cpointer"><span class="Identifier">nimGC_setStackBottom</span></a><span class="Other">(</span><span class="Identifier">theStackBottom</span><span class="Other">:</span> <a href="system.html#pointer"><span class="Identifier">pointer</span></a><span class="Other">)</span> {.<span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
  135. <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  136. <dd>
  137. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/pure/coro.nim#L42" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  138. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/pure/coro.nim#L42" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  139. </dd>
  140. </div>
  141. </div>
  142. <div id="run-procs-all">
  143. <div id="run">
  144. <dt><pre><span class="Keyword">proc</span> <a href="#run"><span class="Identifier">run</span></a><span class="Other">(</span><span class="Other">)</span> {.<span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">TimeEffect</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  145. <dd>
  146. Starts main coroutine scheduler loop which exits when all coroutines exit. Calling this proc starts execution of first coroutine.
  147. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/pure/coro.nim#L298" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  148. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/pure/coro.nim#L298" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  149. </dd>
  150. </div>
  151. </div>
  152. <div id="start-procs-all">
  153. <div id="start,proc),int">
  154. <dt><pre><span class="Keyword">proc</span> <a href="#start%2Cproc%29%2Cint"><span class="Identifier">start</span></a><span class="Other">(</span><span class="Identifier">c</span><span class="Other">:</span> <span class="Keyword">proc</span> <span class="Other">(</span><span class="Other">)</span><span class="Other">;</span> <span class="Identifier">stacksize</span><span class="Other">:</span> <a href="system.html#int"><span class="Identifier">int</span></a> <span class="Other">=</span> <span class="Identifier">defaultStackSize</span><span class="Other">)</span><span class="Other">:</span> <a href="coro.html#CoroutineRef"><span class="Identifier">CoroutineRef</span></a> {.
  155. <span class="Identifier">discardable</span><span class="Other">,</span> <span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  156. <dd>
  157. Schedule coroutine for execution. It does not run immediately.
  158. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/pure/coro.nim#L270" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  159. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/pure/coro.nim#L270" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  160. </dd>
  161. </div>
  162. </div>
  163. <div id="suspend-procs-all">
  164. <div id="suspend,float">
  165. <dt><pre><span class="Keyword">proc</span> <a href="#suspend%2Cfloat"><span class="Identifier">suspend</span></a><span class="Other">(</span><span class="Identifier">sleepTime</span><span class="Other">:</span> <a href="system.html#float"><span class="Identifier">float</span></a> <span class="Other">=</span> <span class="FloatNumber">0.0</span><span class="Other">)</span> {.<span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  166. <dd>
  167. Stops coroutine execution and resumes no sooner than after <tt class="docutils literal"><span class="pre"><span class="Identifier">sleeptime</span></span></tt> seconds. Until then other coroutines are executed.
  168. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/pure/coro.nim#L235" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  169. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/pure/coro.nim#L235" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  170. </dd>
  171. </div>
  172. </div>
  173. <div id="wait-procs-all">
  174. <div id="wait,CoroutineRef,float">
  175. <dt><pre><span class="Keyword">proc</span> <a href="#wait%2CCoroutineRef%2Cfloat"><span class="Identifier">wait</span></a><span class="Other">(</span><span class="Identifier">c</span><span class="Other">:</span> <a href="coro.html#CoroutineRef"><span class="Identifier">CoroutineRef</span></a><span class="Other">;</span> <span class="Identifier">interval</span> <span class="Other">=</span> <span class="FloatNumber">0.01</span><span class="Other">)</span> {.<span><span class="Other pragmadots">...</span></span><span class="pragmawrap"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">forbids</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span>.}</pre></dt>
  176. <dd>
  177. Returns only after coroutine <tt class="docutils literal"><span class="pre"><span class="Identifier">c</span></span></tt> has returned. <tt class="docutils literal"><span class="pre"><span class="Identifier">interval</span></span></tt> is time in seconds how often.
  178. <a href="https://github.com/nim-lang/Nim/tree/devel/lib/pure/coro.nim#L342" class="link-seesrc" target="_blank">Source</a>&nbsp;&nbsp;
  179. <a href="https://github.com/nim-lang/Nim/edit/devel/lib/pure/coro.nim#L342" class="link-seesrc" target="_blank" >Edit</a>&nbsp;&nbsp;
  180. </dd>
  181. </div>
  182. </div>
  183. </dl>
  184. </div>
  185. </div>
  186. </div>
  187. <div class="twelve-columns footer">
  188. <span class="nim-sprite"></span>
  189. <br>
  190. <small style="color: var(--hint);">Made with Nim. Generated: 2025-03-15 14:13:34 UTC</small>
  191. </div>
  192. </div>
  193. </div>
  194. <script defer data-domain="nim-lang.org" src="https://plausible.io/js/plausible.js"></script>
  195. </body>
  196. </html>