PageRenderTime 60ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/doc/html/a00521.html

https://bitbucket.org/mikhailr/intel-tbb-cmake
HTML | 1933 lines | 1932 code | 0 blank | 1 comment | 0 complexity | 0fad2469ecc8cd4cee8a6909368ff3b8 MD5 | raw file
Possible License(s): GPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
  3. <title>flow_graph.h Source File</title>
  4. <link href="doxygen.css" rel="stylesheet" type="text/css">
  5. <link href="tabs.css" rel="stylesheet" type="text/css">
  6. </head><body>
  7. <!-- Generated by Doxygen 1.4.7 -->
  8. <div class="tabs">
  9. <ul>
  10. <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
  11. <li><a href="modules.html"><span>Modules</span></a></li>
  12. <li><a href="namespaces.html"><span>Namespaces</span></a></li>
  13. <li><a href="annotated.html"><span>Classes</span></a></li>
  14. <li id="current"><a href="files.html"><span>Files</span></a></li>
  15. <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  16. </ul></div>
  17. <div class="tabs">
  18. <ul>
  19. <li><a href="files.html"><span>File&nbsp;List</span></a></li>
  20. <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
  21. </ul></div>
  22. <h1>flow_graph.h</h1><a href="a00380.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
  23. <a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2012 Intel Corporation. All Rights Reserved.</span>
  24. <a name="l00003"></a>00003 <span class="comment"></span>
  25. <a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
  26. <a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
  27. <a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
  28. <a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
  29. <a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
  30. <a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
  31. <a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
  32. <a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
  33. <a name="l00012"></a>00012 <span class="comment"></span>
  34. <a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
  35. <a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
  36. <a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
  37. <a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
  38. <a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
  39. <a name="l00018"></a>00018 <span class="comment"> writing.</span>
  40. <a name="l00019"></a>00019 <span class="comment">*/</span>
  41. <a name="l00020"></a>00020
  42. <a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_flow_graph_H</span>
  43. <a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_flow_graph_H</span>
  44. <a name="l00023"></a>00023 <span class="preprocessor"></span>
  45. <a name="l00024"></a>00024 <span class="preprocessor">#include "tbb_stddef.h"</span>
  46. <a name="l00025"></a>00025 <span class="preprocessor">#include "atomic.h"</span>
  47. <a name="l00026"></a>00026 <span class="preprocessor">#include "spin_mutex.h"</span>
  48. <a name="l00027"></a>00027 <span class="preprocessor">#include "null_mutex.h"</span>
  49. <a name="l00028"></a>00028 <span class="preprocessor">#include "spin_rw_mutex.h"</span>
  50. <a name="l00029"></a>00029 <span class="preprocessor">#include "null_rw_mutex.h"</span>
  51. <a name="l00030"></a>00030 <span class="preprocessor">#include "task.h"</span>
  52. <a name="l00031"></a>00031 <span class="preprocessor">#include "concurrent_vector.h"</span>
  53. <a name="l00032"></a>00032 <span class="preprocessor">#include "internal/_aggregator_impl.h"</span>
  54. <a name="l00033"></a>00033
  55. <a name="l00034"></a>00034 <span class="comment">// use the VC10 or gcc version of tuple if it is available.</span>
  56. <a name="l00035"></a>00035 <span class="preprocessor">#if __TBB_CPP11_TUPLE_PRESENT</span>
  57. <a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor"> #include &lt;tuple&gt;</span>
  58. <a name="l00037"></a>00037 <span class="keyword">namespace </span>tbb {
  59. <a name="l00038"></a>00038 <span class="keyword">namespace </span>flow {
  60. <a name="l00039"></a>00039 <span class="keyword">using</span> std::tuple;
  61. <a name="l00040"></a>00040 <span class="keyword">using</span> std::tuple_size;
  62. <a name="l00041"></a>00041 <span class="keyword">using</span> std::tuple_element;
  63. <a name="l00042"></a>00042 <span class="keyword">using</span> std::get;
  64. <a name="l00043"></a>00043 }
  65. <a name="l00044"></a>00044 }
  66. <a name="l00045"></a>00045 <span class="preprocessor">#else</span>
  67. <a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor"> #include "compat/tuple"</span>
  68. <a name="l00047"></a>00047 <span class="preprocessor">#endif</span>
  69. <a name="l00048"></a>00048 <span class="preprocessor"></span>
  70. <a name="l00049"></a>00049 <span class="preprocessor">#include&lt;list&gt;</span>
  71. <a name="l00050"></a>00050 <span class="preprocessor">#include&lt;queue&gt;</span>
  72. <a name="l00051"></a>00051
  73. <a name="l00062"></a>00062 <span class="keyword">namespace </span>tbb {
  74. <a name="l00063"></a>00063 <span class="keyword">namespace </span>flow {
  75. <a name="l00064"></a>00064
  76. <a name="l00066"></a>00066 <span class="keyword">enum</span> concurrency { unlimited = 0, serial = 1 };
  77. <a name="l00067"></a>00067
  78. <a name="l00068"></a>00068 <span class="keyword">namespace </span>interface6 {
  79. <a name="l00069"></a>00069
  80. <a name="l00070"></a>00070 <span class="keyword">namespace </span>internal {
  81. <a name="l00071"></a>00071 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> M&gt; <span class="keyword">class </span>successor_cache;
  82. <a name="l00072"></a>00072 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> M&gt; <span class="keyword">class </span>broadcast_cache;
  83. <a name="l00073"></a>00073 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> M&gt; <span class="keyword">class </span>round_robin_cache;
  84. <a name="l00074"></a>00074 }
  85. <a name="l00075"></a>00075
  86. <a name="l00077"></a><a class="code" href="a00284.html">00077</a> <span class="keyword">class </span><a class="code" href="a00284.html">continue_msg</a> {};
  87. <a name="l00078"></a>00078
  88. <a name="l00079"></a>00079 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> T &gt; <span class="keyword">class </span><a class="code" href="a00334.html">sender</a>;
  89. <a name="l00080"></a>00080 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> T &gt; <span class="keyword">class </span><a class="code" href="a00328.html">receiver</a>;
  90. <a name="l00081"></a>00081 <span class="keyword">class </span><a class="code" href="a00286.html">continue_receiver</a>;
  91. <a name="l00082"></a>00082
  92. <a name="l00084"></a>00084 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> T &gt;
  93. <a name="l00085"></a><a class="code" href="a00334.html">00085</a> <span class="keyword">class </span><a class="code" href="a00334.html">sender</a> {
  94. <a name="l00086"></a>00086 <span class="keyword">public</span>:
  95. <a name="l00088"></a><a class="code" href="a00334.html#127af99916cc085cd9dbc09c53299928">00088</a> <span class="keyword">typedef</span> T <a class="code" href="a00334.html#127af99916cc085cd9dbc09c53299928">output_type</a>;
  96. <a name="l00089"></a>00089
  97. <a name="l00091"></a><a class="code" href="a00334.html#d690e8a54e358968f0ee4fdf9ee73068">00091</a> <span class="keyword">typedef</span> <a class="code" href="a00328.html">receiver&lt;T&gt;</a> <a class="code" href="a00328.html">successor_type</a>;
  98. <a name="l00092"></a>00092
  99. <a name="l00093"></a>00093 <span class="keyword">virtual</span> ~<a class="code" href="a00334.html">sender</a>() {}
  100. <a name="l00094"></a>00094
  101. <a name="l00096"></a>00096 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00334.html#68b8941ad77b9303cf3bcb8cf1f2d28a">register_successor</a>( <a class="code" href="a00334.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> &amp;r ) = 0;
  102. <a name="l00097"></a>00097
  103. <a name="l00099"></a>00099 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00334.html#82f363bfb1738bb8789e167590b10ef9">remove_successor</a>( <a class="code" href="a00334.html#d690e8a54e358968f0ee4fdf9ee73068">successor_type</a> &amp;r ) = 0;
  104. <a name="l00100"></a>00100
  105. <a name="l00102"></a><a class="code" href="a00334.html#922fb56b0aad090b90a98b7d56b76a59">00102</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00334.html#922fb56b0aad090b90a98b7d56b76a59">try_get</a>( T &amp; ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
  106. <a name="l00103"></a>00103
  107. <a name="l00105"></a><a class="code" href="a00334.html#02c05b472271db1b68a48ea2618fa72f">00105</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00334.html#02c05b472271db1b68a48ea2618fa72f">try_reserve</a>( T &amp; ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
  108. <a name="l00106"></a>00106
  109. <a name="l00108"></a><a class="code" href="a00334.html#27036b06d6a91e97007e14f400529199">00108</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00334.html#27036b06d6a91e97007e14f400529199">try_release</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
  110. <a name="l00109"></a>00109
  111. <a name="l00111"></a><a class="code" href="a00334.html#7b840f50da117a0d6848707c1857ea2e">00111</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00334.html#7b840f50da117a0d6848707c1857ea2e">try_consume</a>( ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
  112. <a name="l00112"></a>00112 };
  113. <a name="l00113"></a>00113
  114. <a name="l00114"></a>00114 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> T &gt; <span class="keyword">class </span><a class="code" href="a00299.html">limiter_node</a>; <span class="comment">// needed for resetting decrementer</span>
  115. <a name="l00115"></a>00115 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> R, <span class="keyword">typename</span> B &gt; <span class="keyword">class </span>run_and_put_task;
  116. <a name="l00116"></a>00116
  117. <a name="l00117"></a>00117 <span class="keyword">static</span> <a class="code" href="a00344.html">tbb::task</a> * <span class="keyword">const</span> SUCCESSFULLY_ENQUEUED = (<a class="code" href="a00344.html">task</a> *)-1;
  118. <a name="l00118"></a>00118
  119. <a name="l00119"></a>00119 <span class="comment">// enqueue left task if necessary. Returns the non-enqueued task if there is one.</span>
  120. <a name="l00120"></a>00120 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="a00344.html">tbb::task</a> *combine_tasks( <a class="code" href="a00344.html">tbb::task</a> * left, <a class="code" href="a00344.html">tbb::task</a> * right) {
  121. <a name="l00121"></a>00121 <span class="comment">// if no RHS task, don't change left.</span>
  122. <a name="l00122"></a>00122 <span class="keywordflow">if</span>(right == NULL) <span class="keywordflow">return</span> left;
  123. <a name="l00123"></a>00123 <span class="comment">// right != NULL</span>
  124. <a name="l00124"></a>00124 <span class="keywordflow">if</span>(left == NULL) <span class="keywordflow">return</span> right;
  125. <a name="l00125"></a>00125 <span class="keywordflow">if</span>(left == SUCCESSFULLY_ENQUEUED) <span class="keywordflow">return</span> right;
  126. <a name="l00126"></a>00126 <span class="comment">// left contains a task</span>
  127. <a name="l00127"></a>00127 <span class="keywordflow">if</span>(right != SUCCESSFULLY_ENQUEUED) {
  128. <a name="l00128"></a>00128 <span class="comment">// both are valid tasks</span>
  129. <a name="l00129"></a>00129 <a class="code" href="a00344.html#8365d063c0cc9d7bd616bca47256b93c">tbb::task::enqueue</a>(*left);
  130. <a name="l00130"></a>00130 <span class="keywordflow">return</span> right;
  131. <a name="l00131"></a>00131 }
  132. <a name="l00132"></a>00132 <span class="keywordflow">return</span> left;
  133. <a name="l00133"></a>00133 }
  134. <a name="l00134"></a>00134
  135. <a name="l00136"></a>00136 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> T &gt;
  136. <a name="l00137"></a><a class="code" href="a00328.html">00137</a> <span class="keyword">class </span><a class="code" href="a00328.html">receiver</a> {
  137. <a name="l00138"></a>00138 <span class="keyword">public</span>:
  138. <a name="l00140"></a><a class="code" href="a00328.html#0d0524c99313dedea1e04464bbf2f7ef">00140</a> <span class="keyword">typedef</span> T <a class="code" href="a00284.html">input_type</a>;
  139. <a name="l00141"></a>00141
  140. <a name="l00143"></a><a class="code" href="a00328.html#7fa8cff811e7c1589b805a4bb4c7a74f">00143</a> <span class="keyword">typedef</span> <a class="code" href="a00334.html">sender&lt;T&gt;</a> <a class="code" href="a00334.html">predecessor_type</a>;
  141. <a name="l00144"></a>00144
  142. <a name="l00146"></a><a class="code" href="a00328.html#b00699b235435f7b65b663d5063624a1">00146</a> <span class="keyword">virtual</span> <a class="code" href="a00328.html#b00699b235435f7b65b663d5063624a1">~receiver</a>() {}
  143. <a name="l00147"></a>00147
  144. <a name="l00149"></a><a class="code" href="a00328.html#e1adb4060a7cbac837cd24da57c5a846">00149</a> <span class="keywordtype">bool</span> <a class="code" href="a00328.html#e1adb4060a7cbac837cd24da57c5a846">try_put</a>( <span class="keyword">const</span> T&amp; t ) {
  145. <a name="l00150"></a>00150 <a class="code" href="a00344.html">task</a> *res = try_put_task(t);
  146. <a name="l00151"></a>00151 <span class="keywordflow">if</span>(!res) <span class="keywordflow">return</span> <span class="keyword">false</span>;
  147. <a name="l00152"></a>00152 <span class="keywordflow">if</span> (res != SUCCESSFULLY_ENQUEUED) <a class="code" href="a00344.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>(*res);
  148. <a name="l00153"></a>00153 <span class="keywordflow">return</span> <span class="keyword">true</span>;
  149. <a name="l00154"></a>00154 }
  150. <a name="l00155"></a>00155
  151. <a name="l00157"></a>00157 <span class="keyword">protected</span>:
  152. <a name="l00158"></a><a class="code" href="a00328.html#621bab40a858d214db69ef08d88b67c1">00158</a> <span class="keyword">template</span>&lt; <span class="keyword">typename</span> R, <span class="keyword">typename</span> B &gt; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00328.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a>;
  153. <a name="l00159"></a>00159 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> X, <span class="keyword">typename</span> Y&gt; <span class="keyword">friend</span> <span class="keyword">class </span>internal::broadcast_cache;
  154. <a name="l00160"></a>00160 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> X, <span class="keyword">typename</span> Y&gt; <span class="keyword">friend</span> <span class="keyword">class </span>internal::round_robin_cache;
  155. <a name="l00161"></a>00161 <span class="keyword">virtual</span> <a class="code" href="a00344.html">task</a> *try_put_task(<span class="keyword">const</span> T&amp; t) = 0;
  156. <a name="l00162"></a>00162 <span class="keyword">public</span>:
  157. <a name="l00163"></a>00163
  158. <a name="l00165"></a><a class="code" href="a00328.html#30e3316466efe3a713c23062b6e806f3">00165</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00328.html#30e3316466efe3a713c23062b6e806f3">register_predecessor</a>( <a class="code" href="a00334.html">predecessor_type</a> &amp; ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
  159. <a name="l00166"></a>00166
  160. <a name="l00168"></a><a class="code" href="a00328.html#3bc76547b51d3c9b633e3987d22dce95">00168</a> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="a00328.html#3bc76547b51d3c9b633e3987d22dce95">remove_predecessor</a>( <a class="code" href="a00334.html">predecessor_type</a> &amp; ) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
  161. <a name="l00169"></a>00169
  162. <a name="l00170"></a>00170 <span class="keyword">protected</span>:
  163. <a name="l00172"></a><a class="code" href="a00328.html#3b6d13039c2a8c1e369e5790895b0088">00172</a> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00299.html">limiter_node</a>;
  164. <a name="l00173"></a>00173 <span class="keyword">virtual</span> <span class="keywordtype">void</span> reset_receiver() = 0;
  165. <a name="l00174"></a>00174
  166. <a name="l00175"></a>00175 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> TT, <span class="keyword">typename</span> M&gt;
  167. <a name="l00176"></a>00176 <span class="keyword">friend</span> <span class="keyword">class </span>internal::successor_cache;
  168. <a name="l00177"></a>00177 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> is_continue_receiver() { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
  169. <a name="l00178"></a>00178 };
  170. <a name="l00179"></a>00179
  171. <a name="l00181"></a>00181
  172. <a name="l00182"></a><a class="code" href="a00286.html">00182</a> <span class="keyword">class </span><a class="code" href="a00286.html">continue_receiver</a> : <span class="keyword">public</span> <a class="code" href="a00328.html">receiver</a>&lt; continue_msg &gt; {
  173. <a name="l00183"></a>00183 <span class="keyword">public</span>:
  174. <a name="l00184"></a>00184
  175. <a name="l00186"></a><a class="code" href="a00286.html#3c43c166af832d9187035985841e0a7f">00186</a> <span class="keyword">typedef</span> <a class="code" href="a00284.html">continue_msg</a> <a class="code" href="a00284.html">input_type</a>;
  176. <a name="l00187"></a>00187
  177. <a name="l00189"></a><a class="code" href="a00286.html#f9c58b3e9c46afd2518d0fd8957a5a2f">00189</a> <span class="keyword">typedef</span> <a class="code" href="a00334.html">sender&lt; continue_msg &gt;</a> <a class="code" href="a00334.html">predecessor_type</a>;
  178. <a name="l00190"></a>00190
  179. <a name="l00192"></a><a class="code" href="a00286.html#177db82d548a1f8471371331890b91a8">00192</a> <a class="code" href="a00286.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>( <span class="keywordtype">int</span> number_of_predecessors = 0 ) {
  180. <a name="l00193"></a>00193 my_predecessor_count = my_initial_predecessor_count = number_of_predecessors;
  181. <a name="l00194"></a>00194 my_current_count = 0;
  182. <a name="l00195"></a>00195 }
  183. <a name="l00196"></a>00196
  184. <a name="l00198"></a><a class="code" href="a00286.html#a0b292ed7fa6556b2a735f6d1e82dc74">00198</a> <a class="code" href="a00286.html#177db82d548a1f8471371331890b91a8">continue_receiver</a>( <span class="keyword">const</span> <a class="code" href="a00286.html">continue_receiver</a>&amp; src ) : <a class="code" href="a00328.html">receiver</a>&lt;<a class="code" href="a00284.html">continue_msg</a>&gt;() {
  185. <a name="l00199"></a>00199 my_predecessor_count = my_initial_predecessor_count = src.<a class="code" href="a00286.html#8a0d4c3084fd13902c2d38f31c1dc232">my_initial_predecessor_count</a>;
  186. <a name="l00200"></a>00200 my_current_count = 0;
  187. <a name="l00201"></a>00201 }
  188. <a name="l00202"></a>00202
  189. <a name="l00204"></a><a class="code" href="a00286.html#1e14828fa079b9835ff7267df5ee45d7">00204</a> <span class="keyword">virtual</span> <a class="code" href="a00286.html#1e14828fa079b9835ff7267df5ee45d7">~continue_receiver</a>() { }
  190. <a name="l00205"></a>00205
  191. <a name="l00207"></a><a class="code" href="a00286.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">00207</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00286.html#2fcfa4990a42417bbeb1f3c8b9ac8a22">register_predecessor</a>( <a class="code" href="a00334.html">predecessor_type</a> &amp; ) {
  192. <a name="l00208"></a>00208 <a class="code" href="a00339.html">spin_mutex::scoped_lock</a> l(my_mutex);
  193. <a name="l00209"></a>00209 ++my_predecessor_count;
  194. <a name="l00210"></a>00210 <span class="keywordflow">return</span> <span class="keyword">true</span>;
  195. <a name="l00211"></a>00211 }
  196. <a name="l00212"></a>00212
  197. <a name="l00214"></a>00214
  198. <a name="l00217"></a><a class="code" href="a00286.html#cb691b18416d4742265aed84d496ebbd">00217</a> <span class="comment">/* override */</span> <span class="keywordtype">bool</span> <a class="code" href="a00286.html#cb691b18416d4742265aed84d496ebbd">remove_predecessor</a>( <a class="code" href="a00334.html">predecessor_type</a> &amp; ) {
  199. <a name="l00218"></a>00218 <a class="code" href="a00339.html">spin_mutex::scoped_lock</a> l(my_mutex);
  200. <a name="l00219"></a>00219 --my_predecessor_count;
  201. <a name="l00220"></a>00220 <span class="keywordflow">return</span> <span class="keyword">true</span>;
  202. <a name="l00221"></a>00221 }
  203. <a name="l00222"></a>00222
  204. <a name="l00223"></a>00223 <span class="keyword">protected</span>:
  205. <a name="l00224"></a><a class="code" href="a00286.html#621bab40a858d214db69ef08d88b67c1">00224</a> <span class="keyword">template</span>&lt; <span class="keyword">typename</span> R, <span class="keyword">typename</span> B &gt; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00286.html#621bab40a858d214db69ef08d88b67c1">run_and_put_task</a>;
  206. <a name="l00225"></a>00225 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> X, <span class="keyword">typename</span> Y&gt; <span class="keyword">friend</span> <span class="keyword">class </span>internal::broadcast_cache;
  207. <a name="l00226"></a>00226 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> X, <span class="keyword">typename</span> Y&gt; <span class="keyword">friend</span> <span class="keyword">class </span>internal::round_robin_cache;
  208. <a name="l00227"></a>00227 <span class="comment">// execute body is supposed to be too small to create a task for.</span>
  209. <a name="l00228"></a>00228 <span class="comment">/* override */</span> <a class="code" href="a00344.html">task</a> *try_put_task( <span class="keyword">const</span> <a class="code" href="a00284.html">input_type</a> &amp; ) {
  210. <a name="l00229"></a>00229 {
  211. <a name="l00230"></a>00230 <a class="code" href="a00339.html">spin_mutex::scoped_lock</a> l(my_mutex);
  212. <a name="l00231"></a>00231 <span class="keywordflow">if</span> ( ++my_current_count &lt; my_predecessor_count )
  213. <a name="l00232"></a>00232 <span class="keywordflow">return</span> SUCCESSFULLY_ENQUEUED;
  214. <a name="l00233"></a>00233 <span class="keywordflow">else</span>
  215. <a name="l00234"></a>00234 my_current_count = 0;
  216. <a name="l00235"></a>00235 }
  217. <a name="l00236"></a>00236 <a class="code" href="a00344.html">task</a> * res = <a class="code" href="a00286.html#2165b726212975be532cff7b2f001834">execute</a>();
  218. <a name="l00237"></a>00237 <span class="keywordflow">return</span> res;
  219. <a name="l00238"></a>00238 }
  220. <a name="l00239"></a>00239
  221. <a name="l00240"></a>00240 <a class="code" href="a00338.html">spin_mutex</a> my_mutex;
  222. <a name="l00241"></a>00241 <span class="keywordtype">int</span> my_predecessor_count;
  223. <a name="l00242"></a>00242 <span class="keywordtype">int</span> my_current_count;
  224. <a name="l00243"></a>00243 <span class="keywordtype">int</span> my_initial_predecessor_count;
  225. <a name="l00244"></a>00244 <span class="comment">// the friend declaration in the base class did not eliminate the "protected class"</span>
  226. <a name="l00245"></a>00245 <span class="comment">// error in gcc 4.1.2</span>
  227. <a name="l00246"></a><a class="code" href="a00286.html#3b6d13039c2a8c1e369e5790895b0088">00246</a> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00299.html">limiter_node</a>;
  228. <a name="l00247"></a>00247 <span class="comment">/*override*/</span><span class="keywordtype">void</span> reset_receiver() {
  229. <a name="l00248"></a>00248 my_current_count = 0;
  230. <a name="l00249"></a>00249 }
  231. <a name="l00250"></a>00250
  232. <a name="l00252"></a>00252
  233. <a name="l00254"></a>00254 <span class="keyword">virtual</span> <a class="code" href="a00344.html">task</a> * <a class="code" href="a00286.html#2165b726212975be532cff7b2f001834">execute</a>() = 0;
  234. <a name="l00255"></a>00255 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> TT, <span class="keyword">typename</span> M&gt;
  235. <a name="l00256"></a>00256 <span class="keyword">friend</span> <span class="keyword">class </span>internal::successor_cache;
  236. <a name="l00257"></a>00257 <span class="comment">/*override*/</span> <span class="keywordtype">bool</span> is_continue_receiver() { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
  237. <a name="l00258"></a>00258 };
  238. <a name="l00259"></a>00259
  239. <a name="l00260"></a>00260 <span class="preprocessor">#include "internal/_flow_graph_impl.h"</span>
  240. <a name="l00261"></a>00261 <span class="keyword">using namespace </span>internal::graph_policy_namespace;
  241. <a name="l00262"></a>00262
  242. <a name="l00263"></a>00263 <span class="keyword">class </span>graph;
  243. <a name="l00264"></a>00264 <span class="keyword">class </span>graph_node;
  244. <a name="l00265"></a>00265
  245. <a name="l00266"></a>00266 <span class="keyword">template</span> &lt;<span class="keyword">typename</span> GraphContainerType, <span class="keyword">typename</span> GraphNodeType&gt;
  246. <a name="l00267"></a>00267 <span class="keyword">class </span>graph_iterator {
  247. <a name="l00268"></a>00268 <span class="keyword">friend</span> <span class="keyword">class </span>graph;
  248. <a name="l00269"></a>00269 <span class="keyword">friend</span> <span class="keyword">class </span>graph_node;
  249. <a name="l00270"></a>00270 <span class="keyword">public</span>:
  250. <a name="l00271"></a>00271 <span class="keyword">typedef</span> size_t size_type;
  251. <a name="l00272"></a>00272 <span class="keyword">typedef</span> GraphNodeType value_type;
  252. <a name="l00273"></a>00273 <span class="keyword">typedef</span> GraphNodeType* pointer;
  253. <a name="l00274"></a>00274 <span class="keyword">typedef</span> GraphNodeType&amp; reference;
  254. <a name="l00275"></a>00275 <span class="keyword">typedef</span> <span class="keyword">const</span> GraphNodeType&amp; const_reference;
  255. <a name="l00276"></a>00276 <span class="keyword">typedef</span> std::forward_iterator_tag iterator_category;
  256. <a name="l00277"></a>00277
  257. <a name="l00279"></a>00279 graph_iterator() : my_graph(NULL), current_node(NULL) {}
  258. <a name="l00280"></a>00280
  259. <a name="l00282"></a>00282 graph_iterator(<span class="keyword">const</span> graph_iterator&amp; other) :
  260. <a name="l00283"></a>00283 my_graph(other.my_graph), current_node(other.current_node)
  261. <a name="l00284"></a>00284 {}
  262. <a name="l00285"></a>00285
  263. <a name="l00287"></a>00287 graph_iterator&amp; operator=(<span class="keyword">const</span> graph_iterator&amp; other) {
  264. <a name="l00288"></a>00288 <span class="keywordflow">if</span> (<span class="keyword">this</span> != &amp;other) {
  265. <a name="l00289"></a>00289 my_graph = other.my_graph;
  266. <a name="l00290"></a>00290 current_node = other.current_node;
  267. <a name="l00291"></a>00291 }
  268. <a name="l00292"></a>00292 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
  269. <a name="l00293"></a>00293 }
  270. <a name="l00294"></a>00294
  271. <a name="l00296"></a>00296 reference operator*() <span class="keyword">const</span>;
  272. <a name="l00297"></a>00297
  273. <a name="l00299"></a>00299 pointer operator-&gt;() <span class="keyword">const</span>;
  274. <a name="l00300"></a>00300
  275. <a name="l00302"></a>00302 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> graph_iterator&amp; other)<span class="keyword"> const </span>{
  276. <a name="l00303"></a>00303 <span class="keywordflow">return</span> ((my_graph == other.my_graph) &amp;&amp; (current_node == other.current_node));
  277. <a name="l00304"></a>00304 }
  278. <a name="l00305"></a>00305
  279. <a name="l00307"></a>00307 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> graph_iterator&amp; other)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !(operator==(other)); }
  280. <a name="l00308"></a>00308
  281. <a name="l00310"></a>00310 graph_iterator&amp; operator++() {
  282. <a name="l00311"></a>00311 internal_forward();
  283. <a name="l00312"></a>00312 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
  284. <a name="l00313"></a>00313 }
  285. <a name="l00314"></a>00314
  286. <a name="l00316"></a>00316 graph_iterator operator++(<span class="keywordtype">int</span>) {
  287. <a name="l00317"></a>00317 graph_iterator result = *<span class="keyword">this</span>;
  288. <a name="l00318"></a>00318 operator++();
  289. <a name="l00319"></a>00319 <span class="keywordflow">return</span> result;
  290. <a name="l00320"></a>00320 }
  291. <a name="l00321"></a>00321
  292. <a name="l00322"></a>00322 <span class="keyword">private</span>:
  293. <a name="l00323"></a>00323 <span class="comment">// the graph over which we are iterating</span>
  294. <a name="l00324"></a>00324 GraphContainerType *my_graph;
  295. <a name="l00325"></a>00325 <span class="comment">// pointer into my_graph's my_nodes list</span>
  296. <a name="l00326"></a>00326 pointer current_node;
  297. <a name="l00327"></a>00327
  298. <a name="l00329"></a>00329 graph_iterator(GraphContainerType *g, <span class="keywordtype">bool</span> begin);
  299. <a name="l00330"></a>00330 <span class="keywordtype">void</span> internal_forward();
  300. <a name="l00331"></a>00331 };
  301. <a name="l00332"></a>00332
  302. <a name="l00334"></a>00334
  303. <a name="l00335"></a><a class="code" href="a00295.html">00335</a> <span class="keyword">class </span><a class="code" href="a00295.html">graph</a> : tbb::internal::no_copy {
  304. <a name="l00336"></a>00336 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00296.html">graph_node</a>;
  305. <a name="l00337"></a>00337
  306. <a name="l00338"></a>00338 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> Body &gt;
  307. <a name="l00339"></a>00339 <span class="keyword">class </span>run_task : <span class="keyword">public</span> <a class="code" href="a00344.html">task</a> {
  308. <a name="l00340"></a>00340 <span class="keyword">public</span>:
  309. <a name="l00341"></a>00341 run_task( Body&amp; body ) : my_body(body) {}
  310. <a name="l00342"></a>00342 <a class="code" href="a00344.html">task</a> *execute() {
  311. <a name="l00343"></a>00343 my_body();
  312. <a name="l00344"></a>00344 <span class="keywordflow">return</span> NULL;
  313. <a name="l00345"></a>00345 }
  314. <a name="l00346"></a>00346 <span class="keyword">private</span>:
  315. <a name="l00347"></a>00347 Body my_body;
  316. <a name="l00348"></a>00348 };
  317. <a name="l00349"></a>00349
  318. <a name="l00350"></a>00350 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body &gt;
  319. <a name="l00351"></a>00351 <span class="keyword">class </span>run_and_put_task : <span class="keyword">public</span> <a class="code" href="a00344.html">task</a> {
  320. <a name="l00352"></a>00352 <span class="keyword">public</span>:
  321. <a name="l00353"></a>00353 run_and_put_task( Receiver &amp;r, Body&amp; body ) : my_receiver(r), my_body(body) {}
  322. <a name="l00354"></a>00354 <a class="code" href="a00344.html">task</a> *execute() {
  323. <a name="l00355"></a>00355 <a class="code" href="a00344.html">task</a> *res = my_receiver.try_put_task( my_body() );
  324. <a name="l00356"></a>00356 <span class="keywordflow">if</span>(res == SUCCESSFULLY_ENQUEUED) res = NULL;
  325. <a name="l00357"></a>00357 <span class="keywordflow">return</span> res;
  326. <a name="l00358"></a>00358 }
  327. <a name="l00359"></a>00359 <span class="keyword">private</span>:
  328. <a name="l00360"></a>00360 Receiver &amp;my_receiver;
  329. <a name="l00361"></a>00361 Body my_body;
  330. <a name="l00362"></a>00362 };
  331. <a name="l00363"></a>00363
  332. <a name="l00364"></a>00364 <span class="keyword">public</span>:
  333. <a name="l00366"></a><a class="code" href="a00295.html#4ab3d4b5208ece28c4c3ced647e26e12">00366</a> <span class="keyword">explicit</span> <a class="code" href="a00295.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>() : my_nodes(NULL), my_nodes_last(NULL)
  334. <a name="l00367"></a>00367 {
  335. <a name="l00368"></a>00368 own_context = <span class="keyword">true</span>;
  336. <a name="l00369"></a>00369 cancelled = <span class="keyword">false</span>;
  337. <a name="l00370"></a>00370 caught_exception = <span class="keyword">false</span>;
  338. <a name="l00371"></a>00371 my_context = <span class="keyword">new</span> <a class="code" href="a00347.html">task_group_context</a>();
  339. <a name="l00372"></a>00372 my_root_task = ( <span class="keyword">new</span> ( <a class="code" href="a00344.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(*my_context) ) <a class="code" href="a00287.html">empty_task</a> );
  340. <a name="l00373"></a>00373 my_root_task-&gt;<a class="code" href="a00344.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
  341. <a name="l00374"></a>00374 }
  342. <a name="l00375"></a>00375
  343. <a name="l00377"></a><a class="code" href="a00295.html#104d4f3775f596b43177c29e6b7b7656">00377</a> <span class="keyword">explicit</span> <a class="code" href="a00295.html#4ab3d4b5208ece28c4c3ced647e26e12">graph</a>(<a class="code" href="a00347.html">task_group_context</a>&amp; use_this_context) :
  344. <a name="l00378"></a>00378 my_context(&amp;use_this_context), my_nodes(NULL), my_nodes_last(NULL)
  345. <a name="l00379"></a>00379 {
  346. <a name="l00380"></a>00380 own_context = <span class="keyword">false</span>;
  347. <a name="l00381"></a>00381 my_root_task = ( <span class="keyword">new</span> ( <a class="code" href="a00344.html#23acb0da0afd690da797f9f882027d34">task::allocate_root</a>(*my_context) ) <a class="code" href="a00287.html">empty_task</a> );
  348. <a name="l00382"></a>00382 my_root_task-&gt;<a class="code" href="a00344.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
  349. <a name="l00383"></a>00383 }
  350. <a name="l00384"></a>00384
  351. <a name="l00386"></a>00386
  352. <a name="l00387"></a><a class="code" href="a00295.html#8a7d424c0616a1c37a908ead182e2fe5">00387</a> <a class="code" href="a00295.html#8a7d424c0616a1c37a908ead182e2fe5">~graph</a>() {
  353. <a name="l00388"></a>00388 <a class="code" href="a00295.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>();
  354. <a name="l00389"></a>00389 my_root_task-&gt;<a class="code" href="a00344.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(0);
  355. <a name="l00390"></a>00390 <a class="code" href="a00344.html#dfaacf92685e5f86393bf657b2853bf8">task::destroy</a>( *my_root_task );
  356. <a name="l00391"></a>00391 <span class="keywordflow">if</span> (own_context) <span class="keyword">delete</span> my_context;
  357. <a name="l00392"></a>00392 }
  358. <a name="l00393"></a>00393
  359. <a name="l00395"></a>00395
  360. <a name="l00397"></a><a class="code" href="a00295.html#a993b789d1e488e0c3929135beae560e">00397</a> <span class="keywordtype">void</span> <a class="code" href="a00295.html#a993b789d1e488e0c3929135beae560e">increment_wait_count</a>() {
  361. <a name="l00398"></a>00398 <span class="keywordflow">if</span> (my_root_task)
  362. <a name="l00399"></a>00399 my_root_task-&gt;<a class="code" href="a00344.html#f5fb43c7ad0de5a4b95703cebc39e345">increment_ref_count</a>();
  363. <a name="l00400"></a>00400 }
  364. <a name="l00401"></a>00401
  365. <a name="l00403"></a>00403
  366. <a name="l00405"></a><a class="code" href="a00295.html#29b85506870f13a884a21655aec2a65d">00405</a> <span class="keywordtype">void</span> <a class="code" href="a00295.html#29b85506870f13a884a21655aec2a65d">decrement_wait_count</a>() {
  367. <a name="l00406"></a>00406 <span class="keywordflow">if</span> (my_root_task)
  368. <a name="l00407"></a>00407 my_root_task-&gt;<a class="code" href="a00344.html#ef4680f5c148020c5e7e43ddef44cd5d">decrement_ref_count</a>();
  369. <a name="l00408"></a>00408 }
  370. <a name="l00409"></a>00409
  371. <a name="l00411"></a>00411
  372. <a name="l00413"></a>00413 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> Receiver, <span class="keyword">typename</span> Body &gt;
  373. <a name="l00414"></a><a class="code" href="a00295.html#50a7938df01b6148ab2c0696835f002e">00414</a> <span class="keywordtype">void</span> <a class="code" href="a00295.html#50a7938df01b6148ab2c0696835f002e">run</a>( Receiver &amp;r, Body body ) {
  374. <a name="l00415"></a>00415 <a class="code" href="a00344.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
  375. <a name="l00416"></a>00416 run_and_put_task&lt; Receiver, Body &gt;( r, body ) );
  376. <a name="l00417"></a>00417 }
  377. <a name="l00418"></a>00418
  378. <a name="l00420"></a>00420
  379. <a name="l00422"></a>00422 <span class="keyword">template</span>&lt; <span class="keyword">typename</span> Body &gt;
  380. <a name="l00423"></a><a class="code" href="a00295.html#c1145b00e063793a7e7bf994d202c7a0">00423</a> <span class="keywordtype">void</span> <a class="code" href="a00295.html#50a7938df01b6148ab2c0696835f002e">run</a>( Body body ) {
  381. <a name="l00424"></a>00424 <a class="code" href="a00344.html#8365d063c0cc9d7bd616bca47256b93c">task::enqueue</a>( * <span class="keyword">new</span> ( task::allocate_additional_child_of( *my_root_task ) )
  382. <a name="l00425"></a>00425 run_task&lt; Body &gt;( body ) );
  383. <a name="l00426"></a>00426 }
  384. <a name="l00427"></a>00427
  385. <a name="l00429"></a>00429
  386. <a name="l00430"></a><a class="code" href="a00295.html#a66b0020f7514b86d030fa8aea073d37">00430</a> <span class="keywordtype">void</span> <a class="code" href="a00295.html#a66b0020f7514b86d030fa8aea073d37">wait_for_all</a>() {
  387. <a name="l00431"></a>00431 cancelled = <span class="keyword">false</span>;
  388. <a name="l00432"></a>00432 caught_exception = <span class="keyword">false</span>;
  389. <a name="l00433"></a>00433 <span class="keywordflow">if</span> (my_root_task) {
  390. <a name="l00434"></a>00434 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
  391. <a name="l00435"></a>00435 <span class="preprocessor"></span> <span class="keywordflow">try</span> {
  392. <a name="l00436"></a>00436 <span class="preprocessor">#endif</span>
  393. <a name="l00437"></a>00437 <span class="preprocessor"></span> my_root_task-&gt;<a class="code" href="a00344.html#53d2615ad9c38859b4c8080936600283">wait_for_all</a>();
  394. <a name="l00438"></a>00438 cancelled = my_context-&gt;is_group_execution_cancelled();
  395. <a name="l00439"></a>00439 <span class="preprocessor">#if TBB_USE_EXCEPTIONS</span>
  396. <a name="l00440"></a>00440 <span class="preprocessor"></span> }
  397. <a name="l00441"></a>00441 <span class="keywordflow">catch</span>(...) {
  398. <a name="l00442"></a>00442 my_root_task-&gt;<a class="code" href="a00344.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
  399. <a name="l00443"></a>00443 my_context-&gt;reset();
  400. <a name="l00444"></a>00444 caught_exception = <span class="keyword">true</span>;
  401. <a name="l00445"></a>00445 cancelled = <span class="keyword">true</span>;
  402. <a name="l00446"></a>00446 <span class="keywordflow">throw</span>;
  403. <a name="l00447"></a>00447 }
  404. <a name="l00448"></a>00448 <span class="preprocessor">#endif</span>
  405. <a name="l00449"></a>00449 <span class="preprocessor"></span> my_context-&gt;reset(); <span class="comment">// consistent with behavior in catch()</span>
  406. <a name="l00450"></a>00450 my_root_task-&gt;<a class="code" href="a00344.html#06a4206a57e8e12a439b14d6d41cfd92">set_ref_count</a>(1);
  407. <a name="l00451"></a>00451 }
  408. <a name="l00452"></a>00452 }
  409. <a name="l00453"></a>00453
  410. <a name="l00455"></a><a class="code" href="a00295.html#7f4e3ae90811a5d8b597146b5b586d10">00455</a> <a class="code" href="a00344.html">task</a> * <a class="code" href="a00295.html#7f4e3ae90811a5d8b597146b5b586d10">root_task</a>() {
  411. <a name="l00456"></a>00456 <span class="keywordflow">return</span> my_root_task;
  412. <a name="l00457"></a>00457 }
  413. <a name="l00458"></a>00458
  414. <a name="l00459"></a>00459 <span class="comment">// ITERATORS</span>
  415. <a name="l00460"></a>00460 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> C, <span class="keyword">typename</span> N&gt;
  416. <a name="l00461"></a>00461 <span class="keyword">friend</span> <span class="keyword">class </span>graph_iterator;
  417. <a name="l00462"></a>00462
  418. <a name="l00463"></a>00463 <span class="comment">// Graph iterator typedefs</span>
  419. <a name="l00464"></a>00464 <span class="keyword">typedef</span> graph_iterator&lt;graph,graph_node&gt; iterator;
  420. <a name="l00465"></a>00465 <span class="keyword">typedef</span> graph_iterator&lt;const graph,const graph_node&gt; const_iterator;
  421. <a name="l00466"></a>00466
  422. <a name="l00467"></a>00467 <span class="comment">// Graph iterator constructors</span>
  423. <a name="l00469"></a><a class="code" href="a00295.html#b028cb585ec21e5de523d0075d0fa880">00469</a> <span class="comment"></span> iterator <a class="code" href="a00295.html#b028cb585ec21e5de523d0075d0fa880">begin</a>() { <span class="keywordflow">return</span> iterator(<span class="keyword">this</span>, <span class="keyword">true</span>); }
  424. <a name="l00471"></a><a class="code" href="a00295.html#a167c62511ddacaa152daa64ab2d6aac">00471</a> iterator <a class="code" href="a00295.html#a167c62511ddacaa152daa64ab2d6aac">end</a>() { <span class="keywordflow">return</span> iterator(<span class="keyword">this</span>, <span class="keyword">false</span>); }
  425. <a name="l00473"></a><a class="code" href="a00295.html#f63c3b7d03098b57fc16b71c57b303e5">00473</a> const_iterator <a class="code" href="a00295.html#b028cb585ec21e5de523d0075d0fa880">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(<span class="keyword">this</span>, <span class="keyword">true</span>); }
  426. <a name="l00475"></a><a class="code" href="a00295.html#907bd06606818c36f52420fe8d469d35">00475</a> const_iterator <a class="code" href="a00295.html#a167c62511ddacaa152daa64ab2d6aac">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(<span class="keyword">this</span>, <span class="keyword">false</span>); }
  427. <a name="l00477"></a><a class="code" href="a00295.html#e183dfc3f89dc8f57c06ba165fb89f66">00477</a> const_iterator <a class="code" href="a00295.html#e183dfc3f89dc8f57c06ba165fb89f66">cbegin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(<span class="keyword">this</span>, <span class="keyword">true</span>); }
  428. <a name="l00479"></a><a class="code" href="a00295.html#4866156e6a31d0399b61c6eb82ee81fd">00479</a> const_iterator <a class="code" href="a00295.html#4866156e6a31d0399b61c6eb82ee81fd">cend</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(<span class="keyword">this</span>, <span class="keyword">false</span>); }
  429. <a name="l00480"></a>00480
  430. <a name="l00482"></a><a class="code" href="a00295.html#227ea140dc2c68f79a4e5a34a8367b58">00482</a> <span class="keywordtype">bool</span> <a class="code" href="a00295.html#227ea140dc2c68f79a4e5a34a8367b58">is_cancelled</a>() { <span class="keywordflow">return</span> cancelled; }
  431. <a name="l00483"></a>00483 <span class="keywordtype">bool</span> exception_thrown() { <span class="keywordflow">return</span> caught_exception; }
  432. <a name="l00484"></a>00484
  433. <a name="l00485"></a>00485 <span class="comment">// un-thread-safe state reset.</span>
  434. <a name="l00486"></a>00486 <span class="keywordtype">void</span> reset();
  435. <a name="l00487"></a>00487
  436. <a name="l00488"></a>00488 <span class="keyword">private</span>:
  437. <a name="l00489"></a>00489 <a class="code" href="a00344.html">task</a> *my_root_task;
  438. <a name="l00490"></a>00490 <a class="code" href="a00347.html">task_group_context</a> *my_context;
  439. <a name="l00491"></a>00491 <span class="keywordtype">bool</span> own_context;
  440. <a name="l00492"></a>00492 <span class="keywordtype">bool</span> cancelled;
  441. <a name="l00493"></a>00493 <span class="keywordtype">bool</span> caught_exception;
  442. <a name="l00494"></a>00494
  443. <a name="l00495"></a>00495 <a class="code" href="a00296.html">graph_node</a> *my_nodes, *my_nodes_last;
  444. <a name="l00496"></a>00496
  445. <a name="l00497"></a>00497 <a class="code" href="a00338.html">spin_mutex</a> nodelist_mutex;
  446. <a name="l00498"></a>00498 <span class="keywordtype">void</span> register_node(<a class="code" href="a00296.html">graph_node</a> *n);
  447. <a name="l00499"></a>00499 <span class="keywordtype">void</span> remove_node(<a class="code" href="a00296.html">graph_node</a> *n);
  448. <a name="l00500"></a>00500
  449. <a name="l00501"></a>00501 };
  450. <a name="l00502"></a>00502
  451. <a name="l00503"></a>00503 <span class="keyword">template</span> &lt;<span class="keyword">typename</span> C, <span class="keyword">typename</span> N&gt;
  452. <a name="l00504"></a>00504 graph_iterator&lt;C,N&gt;::graph_iterator(C *g, <span class="keywordtype">bool</span> begin) : my_graph(g), current_node(NULL)
  453. <a name="l00505"></a>00505 {
  454. <a name="l00506"></a>00506 <span class="keywordflow">if</span> (begin) current_node = my_graph-&gt;my_nodes;
  455. <a name="l00507"></a>00507 <span class="comment">//else it is an end iterator by default</span>
  456. <a name="l00508"></a>00508 }
  457. <a name="l00509"></a>00509
  458. <a name="l00510"></a>00510 <span class="keyword">template</span> &lt;<span class="keyword">typename</span> C, <span class="keyword">typename</span> N&gt;
  459. <a name="l00511"></a>00511 <span class="keyword">typename</span> graph_iterator&lt;C,N&gt;::reference graph_iterator&lt;C,N&gt;::operator*()<span class="keyword"> const </span>{
  460. <a name="l00512"></a>00512 __TBB_ASSERT(current_node, <span class="stringliteral">"graph_iterator at end"</span>);
  461. <a name="l00513"></a>00513 <span class="keywordflow">return</span> *operator-&gt;();
  462. <a name="l00514"></a>00514 }
  463. <a name="l00515"></a>00515
  464. <a name="l00516"></a>00516 <span class="keyword">template</span> &lt;<span class="keyword">typename</span> C, <span class="keyword">typename</span> N&gt;
  465. <a name="l00517"></a>00517 <span class="keyword">typename</span> graph_iterator&lt;C,N&gt;::pointer graph_iterator&lt;C,N&gt;::operator-&gt;()<span class="keyword"> const </span>{
  466. <a name="l00518"></a>00518 <span class="keywordflow">return</span> current_node;
  467. <a name="l00519"></a>00519 }
  468. <a name="l00520"></a>00520
  469. <a name="l00521"></a>00521
  470. <a name="l00522"></a>00522 <span class="keyword">template</span> &lt;<span class="keyword">typename</span> C, <span class="keyword">typename</span> N&gt;
  471. <a name="l00523"></a>00523 <span class="keywordtype">void</span> graph_iterator&lt;C,N&gt;::internal_forward() {
  472. <a name="l00524"></a>00524 <span class="keywordflow">if</span> (current_node) current_node = current_node-&gt;next;
  473. <a name="l00525"></a>00525 }
  474. <a name="l00526"></a>00526
  475. <a name="l00528"></a><a class="code" href="a00296.html">00528</a> <span class="keyword">class </span><a class="code" href="a00296.html">graph_node</a> : tbb::internal::no_assign {
  476. <a name="l00529"></a>00529 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00295.html">graph</a>;
  477. <a name="l00530"></a>00530 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> C, <span class="keyword">typename</span> N&gt;
  478. <a name="l00531"></a>00531 <span class="keyword">friend</span> <span class="keyword">class </span>graph_iterator;
  479. <a name="l00532"></a>00532 <span class="keyword">protected</span>:
  480. <a name="l00533"></a>00533 <a class="code" href="a00295.html">graph</a>&amp; my_graph;
  481. <a name="l00534"></a>00534 <a class="code" href="a00296.html">graph_node</a> *next, *prev;
  482. <a name="l00535"></a>00535 <span class="keyword">public</span>:
  483. <a name="l00536"></a>00536 <a class="code" href="a00296.html">graph_node</a>(<a class="code" href="a00295.html">graph</a>&amp; g) : my_

Large files files are truncated, but you can click here to view the full file