sync_8hpp.xml 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?xml version='1.0' encoding='UTF-8' standalone='no'?>
  2. <doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.18.0" xml:lang="ja">
  3. <compounddef id="sync_8hpp" kind="file" language="C++">
  4. <compoundname>sync.hpp</compoundname>
  5. <includes refid="kernel_8hpp" local="yes">kernel.hpp</includes>
  6. <includes local="no">cstdint</includes>
  7. <incdepgraph>
  8. <node id="2">
  9. <label>kernel.hpp</label>
  10. <link refid="kernel_8hpp"/>
  11. <childnode refid="3" relation="include">
  12. </childnode>
  13. <childnode refid="4" relation="include">
  14. </childnode>
  15. <childnode refid="5" relation="include">
  16. </childnode>
  17. </node>
  18. <node id="1">
  19. <label>C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/include/tinykernel/sync.hpp</label>
  20. <link refid="sync_8hpp"/>
  21. <childnode refid="2" relation="include">
  22. </childnode>
  23. <childnode refid="6" relation="include">
  24. </childnode>
  25. </node>
  26. <node id="6">
  27. <label>cstdint</label>
  28. </node>
  29. <node id="5">
  30. <label>pico/runtime.h</label>
  31. </node>
  32. <node id="4">
  33. <label>stddef.h</label>
  34. </node>
  35. <node id="3">
  36. <label>stdint.h</label>
  37. </node>
  38. </incdepgraph>
  39. <innerclass refid="classtk_1_1_semaphore" prot="public">tk::Semaphore</innerclass>
  40. <innerclass refid="classtk_1_1_mutex" prot="public">tk::Mutex</innerclass>
  41. <innerclass refid="classtk_1_1_lock_guard" prot="public">tk::LockGuard</innerclass>
  42. <innernamespace refid="namespacetk">tk</innernamespace>
  43. <briefdescription>
  44. </briefdescription>
  45. <detaileddescription>
  46. </detaileddescription>
  47. <programlisting>
  48. <codeline lineno="1"><highlight class="preprocessor">#pragma<sp/>once</highlight><highlight class="normal"></highlight></codeline>
  49. <codeline lineno="2"><highlight class="normal"></highlight></codeline>
  50. <codeline lineno="3"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&quot;<ref refid="kernel_8hpp" kindref="compound">kernel.hpp</ref>&quot;</highlight><highlight class="normal"></highlight></codeline>
  51. <codeline lineno="4"><highlight class="normal"></highlight><highlight class="preprocessor">#include<sp/>&lt;cstdint&gt;</highlight><highlight class="normal"></highlight></codeline>
  52. <codeline lineno="5"><highlight class="normal"></highlight></codeline>
  53. <codeline lineno="6"><highlight class="normal"></highlight><highlight class="keyword">namespace<sp/></highlight><highlight class="normal"><ref refid="namespacetk" kindref="compound">tk</ref><sp/>{</highlight></codeline>
  54. <codeline lineno="7"><highlight class="normal"></highlight></codeline>
  55. <codeline lineno="24" refid="classtk_1_1_semaphore" refkind="compound"><highlight class="normal"></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="classtk_1_1_semaphore_1a66c5ac90338a6fcc6a9c2f22f1586de8" kindref="member">Semaphore</ref><sp/>{</highlight></codeline>
  56. <codeline lineno="25"><highlight class="normal"></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
  57. <codeline lineno="31" refid="classtk_1_1_semaphore_1a66c5ac90338a6fcc6a9c2f22f1586de8" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">explicit</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_semaphore_1a66c5ac90338a6fcc6a9c2f22f1586de8" kindref="member">Semaphore</ref>(int32_t<sp/>initial_count<sp/>=<sp/>1,<sp/>int32_t<sp/>max_count<sp/>=<sp/>1)</highlight></codeline>
  58. <codeline lineno="32"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>:<sp/>count_(initial_count),<sp/>max_count_(max_count)<sp/>{}</highlight></codeline>
  59. <codeline lineno="33"><highlight class="normal"></highlight></codeline>
  60. <codeline lineno="39" refid="classtk_1_1_semaphore_1a863ccee07bc701a78342c14503955d73" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_semaphore_1a863ccee07bc701a78342c14503955d73" kindref="member">acquire</ref>()<sp/>{</highlight></codeline>
  61. <codeline lineno="40"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  62. <codeline lineno="41"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">while</highlight><highlight class="normal"><sp/>(count_<sp/>&lt;=<sp/>0)<sp/>{</highlight></codeline>
  63. <codeline lineno="42"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint8_t<sp/>slot<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a73a80d92a172d565201f99e8f31278e4" kindref="member">detail::current_task_slot</ref>();</highlight></codeline>
  64. <codeline lineno="43"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>wait_mask_<sp/>|=<sp/>(<ref refid="namespacetk_1add371a241ec6c1695ef4e67935317edd" kindref="member">task_mask_t</ref>{1}<sp/>&lt;&lt;<sp/>slot);</highlight></codeline>
  65. <codeline lineno="44"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a400363f36b5fb5dfc8aec11334471d0d" kindref="member">detail::block_current_task_locked</ref>();</highlight></codeline>
  66. <codeline lineno="45"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  67. <codeline lineno="46"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="comment">//<sp/>他タスクから<sp/>release()<sp/>されて再開したら再チェック</highlight><highlight class="normal"></highlight></codeline>
  68. <codeline lineno="47"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  69. <codeline lineno="48"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  70. <codeline lineno="49"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>count_--;</highlight></codeline>
  71. <codeline lineno="50"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  72. <codeline lineno="51"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  73. <codeline lineno="52"><highlight class="normal"></highlight></codeline>
  74. <codeline lineno="59" refid="classtk_1_1_semaphore_1a3a246c8afc866dc438186d0a53cad5c2" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_semaphore_1a3a246c8afc866dc438186d0a53cad5c2" kindref="member">try_acquire</ref>()<sp/>{</highlight></codeline>
  75. <codeline lineno="60"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  76. <codeline lineno="61"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>success<sp/>=<sp/></highlight><highlight class="keyword">false</highlight><highlight class="normal">;</highlight></codeline>
  77. <codeline lineno="62"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(count_<sp/>&gt;<sp/>0)<sp/>{</highlight></codeline>
  78. <codeline lineno="63"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>count_--;</highlight></codeline>
  79. <codeline lineno="64"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>success<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  80. <codeline lineno="65"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  81. <codeline lineno="66"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  82. <codeline lineno="67"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>success;</highlight></codeline>
  83. <codeline lineno="68"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  84. <codeline lineno="69"><highlight class="normal"></highlight></codeline>
  85. <codeline lineno="73" refid="classtk_1_1_semaphore_1a7bb8eb8b0bd69b2f6b0a4d89d0f5b07b" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_semaphore_1a7bb8eb8b0bd69b2f6b0a4d89d0f5b07b" kindref="member">release</ref>()<sp/>{</highlight></codeline>
  86. <codeline lineno="74"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  87. <codeline lineno="75"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(count_<sp/>&lt;<sp/>max_count_)<sp/>{</highlight></codeline>
  88. <codeline lineno="76"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>count_++;</highlight></codeline>
  89. <codeline lineno="77"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  90. <codeline lineno="78"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(wait_mask_<sp/>!=<sp/>0)<sp/>{</highlight></codeline>
  91. <codeline lineno="79"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint8_t<sp/>slot<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a70ba35e0daee086ad86770f1e39c9b35" kindref="member">detail::find_highest_prio_waiter</ref>(wait_mask_);</highlight></codeline>
  92. <codeline lineno="80"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(slot<sp/>!=<sp/>0xFF)<sp/>{</highlight></codeline>
  93. <codeline lineno="81"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>wait_mask_<sp/>&amp;=<sp/>~(<ref refid="namespacetk_1add371a241ec6c1695ef4e67935317edd" kindref="member">task_mask_t</ref>{1}<sp/>&lt;&lt;<sp/>slot);</highlight></codeline>
  94. <codeline lineno="82"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1ab19385598f18560cb574cc86174ececa" kindref="member">detail::wake_task_locked</ref>(<ref refid="structtk_1_1_task_handle" kindref="compound">TaskHandle</ref>{slot});</highlight></codeline>
  95. <codeline lineno="83"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  96. <codeline lineno="84"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  97. <codeline lineno="85"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  98. <codeline lineno="86"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  99. <codeline lineno="87"><highlight class="normal"></highlight></codeline>
  100. <codeline lineno="89" refid="classtk_1_1_semaphore_1ae53b9c57cc25fafb242a21776f112701" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/>int32_t<sp/><ref refid="classtk_1_1_semaphore_1ae53b9c57cc25fafb242a21776f112701" kindref="member">count</ref>()</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
  101. <codeline lineno="90"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  102. <codeline lineno="91"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>int32_t<sp/>c<sp/>=<sp/>count_;</highlight></codeline>
  103. <codeline lineno="92"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  104. <codeline lineno="93"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>c;</highlight></codeline>
  105. <codeline lineno="94"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  106. <codeline lineno="95"><highlight class="normal"></highlight></codeline>
  107. <codeline lineno="96"><highlight class="normal"></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
  108. <codeline lineno="97"><highlight class="normal"><sp/><sp/><sp/><sp/>int32_t<sp/>count_;</highlight></codeline>
  109. <codeline lineno="98"><highlight class="normal"><sp/><sp/><sp/><sp/>int32_t<sp/>max_count_;</highlight></codeline>
  110. <codeline lineno="99"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1add371a241ec6c1695ef4e67935317edd" kindref="member">task_mask_t</ref><sp/>wait_mask_{0};</highlight></codeline>
  111. <codeline lineno="100"><highlight class="normal">};</highlight></codeline>
  112. <codeline lineno="101"><highlight class="normal"></highlight></codeline>
  113. <codeline lineno="105" refid="namespacetk_1ab1f2fa3d79e99f13610bd330a0df928b" refkind="member"><highlight class="normal"></highlight><highlight class="keyword">using<sp/></highlight><highlight class="normal"><ref refid="namespacetk_1ab1f2fa3d79e99f13610bd330a0df928b" kindref="member">BinarySemaphore</ref><sp/>=<sp/><ref refid="classtk_1_1_semaphore" kindref="compound">Semaphore</ref>;</highlight></codeline>
  114. <codeline lineno="106"><highlight class="normal"></highlight></codeline>
  115. <codeline lineno="123" refid="classtk_1_1_mutex" refkind="compound"><highlight class="normal"></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="classtk_1_1_mutex_1a8b17431db60f4ab48a3859b2ca722eb1" kindref="member">Mutex</ref><sp/>{</highlight></codeline>
  116. <codeline lineno="124"><highlight class="normal"></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
  117. <codeline lineno="125" refid="classtk_1_1_mutex_1a8b17431db60f4ab48a3859b2ca722eb1" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="classtk_1_1_mutex_1a8b17431db60f4ab48a3859b2ca722eb1" kindref="member">Mutex</ref>()<sp/>=<sp/></highlight><highlight class="keywordflow">default</highlight><highlight class="normal">;</highlight></codeline>
  118. <codeline lineno="126"><highlight class="normal"></highlight></codeline>
  119. <codeline lineno="132" refid="classtk_1_1_mutex_1a7f5645bba55df2db263f92a954802c27" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_mutex_1a7f5645bba55df2db263f92a954802c27" kindref="member">lock</ref>()<sp/>{</highlight></codeline>
  120. <codeline lineno="133"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  121. <codeline lineno="134"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint8_t<sp/>my_slot<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a73a80d92a172d565201f99e8f31278e4" kindref="member">detail::current_task_slot</ref>();</highlight></codeline>
  122. <codeline lineno="135"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">while</highlight><highlight class="normal"><sp/>(locked_)<sp/>{</highlight></codeline>
  123. <codeline lineno="136"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>wait_mask_<sp/>|=<sp/>(<ref refid="namespacetk_1add371a241ec6c1695ef4e67935317edd" kindref="member">task_mask_t</ref>{1}<sp/>&lt;&lt;<sp/>my_slot);</highlight></codeline>
  124. <codeline lineno="137"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a400363f36b5fb5dfc8aec11334471d0d" kindref="member">detail::block_current_task_locked</ref>();</highlight></codeline>
  125. <codeline lineno="138"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  126. <codeline lineno="139"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  127. <codeline lineno="140"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  128. <codeline lineno="141"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>locked_<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  129. <codeline lineno="142"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>owner_slot_<sp/>=<sp/>my_slot;</highlight></codeline>
  130. <codeline lineno="143"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  131. <codeline lineno="144"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  132. <codeline lineno="145"><highlight class="normal"></highlight></codeline>
  133. <codeline lineno="152" refid="classtk_1_1_mutex_1a666dd03fb22c5cb855e3145f76a58b9c" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_mutex_1a666dd03fb22c5cb855e3145f76a58b9c" kindref="member">try_lock</ref>()<sp/>{</highlight></codeline>
  134. <codeline lineno="153"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  135. <codeline lineno="154"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint8_t<sp/>my_slot<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a73a80d92a172d565201f99e8f31278e4" kindref="member">detail::current_task_slot</ref>();</highlight></codeline>
  136. <codeline lineno="155"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>success<sp/>=<sp/></highlight><highlight class="keyword">false</highlight><highlight class="normal">;</highlight></codeline>
  137. <codeline lineno="156"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(!locked_)<sp/>{</highlight></codeline>
  138. <codeline lineno="157"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>locked_<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  139. <codeline lineno="158"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>owner_slot_<sp/>=<sp/>my_slot;</highlight></codeline>
  140. <codeline lineno="159"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>success<sp/>=<sp/></highlight><highlight class="keyword">true</highlight><highlight class="normal">;</highlight></codeline>
  141. <codeline lineno="160"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  142. <codeline lineno="161"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  143. <codeline lineno="162"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>success;</highlight></codeline>
  144. <codeline lineno="163"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  145. <codeline lineno="164"><highlight class="normal"></highlight></codeline>
  146. <codeline lineno="171" refid="classtk_1_1_mutex_1ae8d5dfd5655b5aa54d63db6e0cf2f707" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">void</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_mutex_1ae8d5dfd5655b5aa54d63db6e0cf2f707" kindref="member">unlock</ref>()<sp/>{</highlight></codeline>
  147. <codeline lineno="172"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  148. <codeline lineno="173"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint8_t<sp/>my_slot<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a73a80d92a172d565201f99e8f31278e4" kindref="member">detail::current_task_slot</ref>();</highlight></codeline>
  149. <codeline lineno="174"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(locked_<sp/>&amp;&amp;<sp/>owner_slot_<sp/>==<sp/>my_slot)<sp/>{</highlight></codeline>
  150. <codeline lineno="175"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>locked_<sp/>=<sp/></highlight><highlight class="keyword">false</highlight><highlight class="normal">;</highlight></codeline>
  151. <codeline lineno="176"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>owner_slot_<sp/>=<sp/>0xFF;</highlight></codeline>
  152. <codeline lineno="177"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(wait_mask_<sp/>!=<sp/>0)<sp/>{</highlight></codeline>
  153. <codeline lineno="178"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint8_t<sp/>slot<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a70ba35e0daee086ad86770f1e39c9b35" kindref="member">detail::find_highest_prio_waiter</ref>(wait_mask_);</highlight></codeline>
  154. <codeline lineno="179"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">if</highlight><highlight class="normal"><sp/>(slot<sp/>!=<sp/>0xFF)<sp/>{</highlight></codeline>
  155. <codeline lineno="180"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>wait_mask_<sp/>&amp;=<sp/>~(<ref refid="namespacetk_1add371a241ec6c1695ef4e67935317edd" kindref="member">task_mask_t</ref>{1}<sp/>&lt;&lt;<sp/>slot);</highlight></codeline>
  156. <codeline lineno="181"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1ab19385598f18560cb574cc86174ececa" kindref="member">detail::wake_task_locked</ref>(<ref refid="structtk_1_1_task_handle" kindref="compound">TaskHandle</ref>{slot});</highlight></codeline>
  157. <codeline lineno="182"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  158. <codeline lineno="183"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  159. <codeline lineno="184"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>}</highlight></codeline>
  160. <codeline lineno="185"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  161. <codeline lineno="186"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  162. <codeline lineno="187"><highlight class="normal"></highlight></codeline>
  163. <codeline lineno="189" refid="classtk_1_1_mutex_1acf574e35540879481f1f6e5452a504ab" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_mutex_1acf574e35540879481f1f6e5452a504ab" kindref="member">is_locked</ref>()</highlight><highlight class="keyword"><sp/>const<sp/></highlight><highlight class="normal">{</highlight></codeline>
  164. <codeline lineno="190"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>uint32_t<sp/>save<sp/>=<sp/><ref refid="namespacetk_1_1detail_1a5b8fa6406a867edf8c4410fcb03c6523" kindref="member">detail::sched_lock</ref>();</highlight></codeline>
  165. <codeline lineno="191"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>lk<sp/>=<sp/>locked_;</highlight></codeline>
  166. <codeline lineno="192"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/><ref refid="namespacetk_1_1detail_1a80be9b2429346faf161eab01f595684b" kindref="member">detail::sched_unlock</ref>(save);</highlight></codeline>
  167. <codeline lineno="193"><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/></highlight><highlight class="keywordflow">return</highlight><highlight class="normal"><sp/>lk;</highlight></codeline>
  168. <codeline lineno="194"><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
  169. <codeline lineno="195"><highlight class="normal"></highlight></codeline>
  170. <codeline lineno="196"><highlight class="normal"></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
  171. <codeline lineno="197"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keywordtype">bool</highlight><highlight class="normal"><sp/>locked_{</highlight><highlight class="keyword">false</highlight><highlight class="normal">};</highlight></codeline>
  172. <codeline lineno="198"><highlight class="normal"><sp/><sp/><sp/><sp/>uint8_t<sp/>owner_slot_{0xFF};</highlight></codeline>
  173. <codeline lineno="199"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="namespacetk_1add371a241ec6c1695ef4e67935317edd" kindref="member">task_mask_t</ref><sp/>wait_mask_{0};</highlight></codeline>
  174. <codeline lineno="200"><highlight class="normal">};</highlight></codeline>
  175. <codeline lineno="201"><highlight class="normal"></highlight></codeline>
  176. <codeline lineno="210"><highlight class="normal"></highlight><highlight class="keyword">template</highlight><highlight class="normal"><sp/>&lt;</highlight><highlight class="keyword">typename</highlight><highlight class="normal"><sp/>Lockable&gt;</highlight></codeline>
  177. <codeline lineno="211" refid="classtk_1_1_lock_guard" refkind="compound"><highlight class="normal"></highlight><highlight class="keyword">class<sp/></highlight><highlight class="normal"><ref refid="classtk_1_1_lock_guard_1a3a922c7edf84ce25ef67151c322bb0eb" kindref="member">LockGuard</ref><sp/>{</highlight></codeline>
  178. <codeline lineno="212"><highlight class="normal"></highlight><highlight class="keyword">public</highlight><highlight class="normal">:</highlight></codeline>
  179. <codeline lineno="217" refid="classtk_1_1_lock_guard_1a3a922c7edf84ce25ef67151c322bb0eb" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/></highlight><highlight class="keyword">explicit</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_lock_guard_1a3a922c7edf84ce25ef67151c322bb0eb" kindref="member">LockGuard</ref>(Lockable&amp;<sp/>m)<sp/>:<sp/>m_(m)<sp/>{<sp/>m_.lock();<sp/>}</highlight></codeline>
  180. <codeline lineno="218"><highlight class="normal"></highlight></codeline>
  181. <codeline lineno="220" refid="classtk_1_1_lock_guard_1a52eeb50abee00bd0ed16cfa6618ce40f" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="classtk_1_1_lock_guard_1a52eeb50abee00bd0ed16cfa6618ce40f" kindref="member">~LockGuard</ref>()<sp/>{<sp/>m_.unlock();<sp/>}</highlight></codeline>
  182. <codeline lineno="221"><highlight class="normal"></highlight></codeline>
  183. <codeline lineno="222" refid="classtk_1_1_lock_guard_1af9bc86bc2036c4b8e54633ddee811604" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="classtk_1_1_lock_guard_1af9bc86bc2036c4b8e54633ddee811604" kindref="member">LockGuard</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_lock_guard_1a3a922c7edf84ce25ef67151c322bb0eb" kindref="member">LockGuard</ref>&amp;)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
  184. <codeline lineno="223" refid="classtk_1_1_lock_guard_1a3f121f8aa1307f0f6e6e608cf138340c" refkind="member"><highlight class="normal"><sp/><sp/><sp/><sp/><ref refid="classtk_1_1_lock_guard_1a3a922c7edf84ce25ef67151c322bb0eb" kindref="member">LockGuard</ref>&amp;<sp/><ref refid="classtk_1_1_lock_guard_1a3f121f8aa1307f0f6e6e608cf138340c" kindref="member">operator=</ref>(</highlight><highlight class="keyword">const</highlight><highlight class="normal"><sp/><ref refid="classtk_1_1_lock_guard_1a3a922c7edf84ce25ef67151c322bb0eb" kindref="member">LockGuard</ref>&amp;)<sp/>=<sp/></highlight><highlight class="keyword">delete</highlight><highlight class="normal">;</highlight></codeline>
  185. <codeline lineno="224"><highlight class="normal"></highlight></codeline>
  186. <codeline lineno="225"><highlight class="normal"></highlight><highlight class="keyword">private</highlight><highlight class="normal">:</highlight></codeline>
  187. <codeline lineno="226"><highlight class="normal"><sp/><sp/><sp/><sp/>Lockable&amp;<sp/>m_;</highlight></codeline>
  188. <codeline lineno="227"><highlight class="normal">};</highlight></codeline>
  189. <codeline lineno="228"><highlight class="normal"></highlight></codeline>
  190. <codeline lineno="229"><highlight class="normal">}<sp/><sp/></highlight><highlight class="comment">//<sp/>namespace<sp/>tk</highlight><highlight class="normal"></highlight></codeline>
  191. </programlisting>
  192. <location file="C:/Users/yoneda/Documents/Pico_Projects/tinykernel/tinykernel/include/tinykernel/sync.hpp"/>
  193. </compounddef>
  194. </doxygen>